动态2D数组 - 分配不起作用(segfault)

时间:2012-08-08 19:40:38

标签: c arrays pointers 2d dynamic-allocation

为什么这不起作用?我已多次查看我的代码,但却找不到错误。

谢谢!

void generateData(float** inData, int x, int y){
    inData[0][0]= 3000.0; // SEGFAULT
}

float** createMatrix(int x, int y){
    float** array= malloc(sizeof(float*) * y);
    for(int i=0; i<y; i++)
        array[i] = malloc(sizeof(float) * x);
}

int main(int argc, char** argv) {
    float** arr = createMatrix(100,2);

    generateData(arr, 100, 2);

    return(0);
}

3 个答案:

答案 0 :(得分:3)

你忘了这个如此重要的路线;

return array;
createMatrix中的

。查看编译器警告,或者如果您还没有打开它们,请将它们打开。

答案 1 :(得分:0)

不确定此代码段是否与您的代码直接相关,但您从未从createMatrix()返回该地址。

答案 2 :(得分:0)

return array;是代码中的一个问题。除此之外还有一个大问题。

float** array= malloc(sizeof(float*) * y); - 您首先为数组分配内存以存储指针数组(浮点数)。然后你为每一行malloc(sizeof(float) * x);

分配内存

现在您已为2行和100列分配内存。然后调用generateData(arr, 100, 2);。在generateData如果你喜欢inData[100][2],这将导致崩溃。因为您只分配了2行,每行有100个元素。 inData[100][2]相当于*( *(inData + 100) + 2)。这里*(inData + 100)将导致崩溃(未定义的行为)。因为您只能访问索引1而不是100

错误在createMatrix函数中,您错误地使用了xy。重写你的功能如下。

float** createMatrix(int x, int y)
{
    int i;
    float** array= (float **)malloc(sizeof(float*) * x);
    for(int i=0; i<x; i++)
    {
        array[i] = (float *)malloc(sizeof(float) * y);
    }
    return array;
}

还要重写您的generateData,如下所示。

void generateData(float** inData, int x, int y)
{
    x--;
    y--;    
    inData[i][j]= 3000.0; //Do you assignment to array here
}