c - 使用 malloc 在运行时分配内存时出现段错误

标签 c arrays pointers malloc dynamic-memory-allocation

<分区>

这是我的代码。我的目的是在运行时将内存分配给 2D array,直到输入中给出的任何大小。

为什么会发生段错误?是不是因为数组元素必须连续存储,而ma​​lloc(动态分配)不允许这种情况发生? 我在编写这段代码时犯了一些错误。请指导我完成。 提前致谢。

int main(){
    // STEP 1
    int size,**arr,i=0,j=0;
    printf("Enter the size of matrix : ");
    scanf("%d",&size);
    // STEP 2
    arr = (int**)malloc(size*size*sizeof(int));
    printf("\n Enter the %d elements  : \n",size*size);
    for(i=0;i<size;i++){
        for(j=0;j<size;j++){
        // STEP 3
            scanf("%d",&arr[i][j]);
        }
    }
    /*
    for(i=0;i<size;i++){
        for(j=0;j<size;j++){
            printf("%d\n",matrix[i][j]);
        }
    }
    */
    return 0;
}

最佳答案

这是一个典型的错误。

指向指针的指针其实和二维数组不一样。

当然,您可以通过var[x][y] 语法访问两者的元素,但是

的内存布局
int foo[x][y]

不同于

int **bar

如果你真的想要这种动态,你将不得不为你的指针列表分配空间,然后依次为你的元素分配空间给每个指针。

bar = malloc( x * sizeof(int*) );
for ( int i = 0 ; i < x ; i++ )
    bar[i] = malloc( y * sizeof(int) );

如果可能的话,您应该尽量避免这种情况,而使用实际的二维数组,从 C99 开始,您可以在堆栈上声明它,即使它的大小在运行时确定也是如此:

int main()
{
    int n;
    scanf("%d", &n);
    int array[n][n];
    // ...
    return 0;
}

关于c - 使用 malloc 在运行时分配内存时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23907312/

相关文章:

c - freertos 中的堆栈溢出

arrays - Swift - 追加对象 : array index out of range

c - 为什么这个函数不能成功插入一个节点到一个链表中?

c++ - 指针为什么不存储和打印与应该匹配的对象相同的数据? (C++)

c - 使用二维数组创建和存储波形文件数据时遇到问题

C 通过引用函数传递复杂结构

javascript - 基于分隔的结尾过滤字符串数组

c++ - 如何使用 Crypto++ 加密字节数组

c - 将字符串作为输入到字符串指针数组中并显示它们

c - 当我 malloc 错误的内存量时,为什么 C 不会崩溃