分配一个二维数组

3

我的目标是为了效率,只使用一行来分配一个2D数组。因为我的教授希望它是高效的。 这段代码给我一个错误,说它无法将void*转换为int。

#include<stdio.h>
#include<stdlib.h>

#define NUMOFCOL 4

int **addtwoarr(int (*A)[NUMOFCOL], int (*B)[NUMOFCOL]);

int main(void){
    int firstarr[4][4]={{1,1,1,1},
                        {1,1,1,1},
                        {1,1,1,1},
                        {1,1,1,1}},
        secondarr[4][4]={{1,1,1,1},
                        {1,1,1,1},
                        {1,1,1,1},
                        {1,1,1,1}}, **receiver;
    receiver = addtwoarr(firstarr, secondarr);
    printf("%d", receiver[3][3]);
}

int **addtwoarr(int (*A)[NUMOFCOL], int (*B)[NUMOFCOL]){
    int col, row, **arr;
    (*arr)[NUMOFCOL] = malloc(NUMOFCOL * sizeof(*arr)); /*this line in particular gives the error */
    for(row=0; row<NUMOFCOL; row++){
        for(col=0;col<NUMOFCOL; arr[row][col]=A[row][col]+B[row][col], col++){}
    }
    return arr;
}

分配内存的过程发生在addtwoarr函数中,这也是错误发生的地方。


1
(*arr)[NUMOFCOL] = ...?嗯,最好在到达该行之前,arr指向某个东西。其余部分看起来像是猜测。 - WhozCraig
静态初始化怎么样?根本不需要运行时。 - cadaniluk
啊。我看过人们这样写 int (*m)[CCOLS] = malloc(cRows * sizeof(*m)); 但我就是搞不定那一部分。 - Joshua
我正在尝试复制它,因为它使用malloc分配了一个二维数组,并且只占用一行。其他的分配方式需要循环。 - Joshua
返回值同样重要。int **arr 是一个指向 int 指针的指针;而不是一个指向数组的指针。也就是说,那也是错误的。 - WhozCraig
啊,好的。谢谢你指出来。 - Joshua
1个回答

2

我强烈不建议这样做,因为您的代码对顶部大小有很多假设。但是如果您真的想要这样做,用于返回指向C语言固定长度数组的指针的相当神秘的语法如下:

#include <stdio.h>
#include <stdlib.h>

#define NUMOFCOL 4

int (*addtwoarr(int A[][NUMOFCOL], int B[][NUMOFCOL]))[NUMOFCOL];

int main(void)
{
    int firstarr[][NUMOFCOL] = {
        {1,1,1,1},
        {1,1,1,1},
        {1,1,1,1},
        {1,1,1,1}},

    secondarr[][NUMOFCOL] = {
        {1,1,1,1},
        {1,1,1,1},
        {1,1,1,1},
        {1,1,1,1}};

    int (*receiver)[NUMOFCOL] =  addtwoarr(firstarr, secondarr);
    printf("%d\n", receiver[3][3]);
    free(receiver);
}

int (*addtwoarr(int A[][NUMOFCOL], int B[][NUMOFCOL]))[NUMOFCOL]
{
    int col, row;
    int (*arr)[NUMOFCOL] = malloc(NUMOFCOL * sizeof(*arr));
    for(row=0; row<NUMOFCOL; row++){
        for(col=0;col<NUMOFCOL; arr[row][col]=A[row][col]+B[row][col], col++);
    }
    return arr;
}

输出

2

祝你好运。


1
不是真的。你总是可以返回void *,但我更不建议这样做。为了保持理智,我将省略描述如何分配一个带有线性数据序列的指针数组的方法(相信我,你也不想那样做)。 - WhozCraig
啊,好的。但是在分配一个二维数组方面,哪种方法最好?有没有一种不使用for循环的方法?感谢您回答我的问题。 - Joshua
“最好”的定义因人而异。每件事都有一定的优点和缺点。我向您展示的方法的优点是可以进行单一、简单的分配,但代价是灵活性受限(只允许NUMOFCOL列宽)和语法可能晦涩难懂。但这确实是一个真正的数组。指针数组方法(type **)允许变长行、快速行插入等,但需要更多的指针管理。这真的取决于您的情况。很高兴能帮到您。 - WhozCraig
好的,我猜这取决于具体情况。再次感谢。 - Joshua
1
@Joshua: "*无效的从'void '到'int ()[4]'的转换[-fpermissive]" "27 9 C:\Fraps\Addmatrix.cpp" 使用C++编译器编译旨在成为C代码的代码可能不是一个好主意。 - alk
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接