【问题标题】:C - 2d array print crashing after initializationC - 初始化后二维数组打印崩溃
【发布时间】:2017-07-24 08:20:32
【问题描述】:

我想尝试一些 C 基础知识,因为我已经好几年没见过这种语言了。所以,我写了一个非常简单的程序,它分配一个二维数组,然后我想用一些值初始化它并打印它。

问题是 - 当我初始化元素 [0][0][0][1] 时,当我尝试打印第 4 行时程序崩溃。

你知道问题出在哪里吗?


我的代码(MWE)

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

int main () {

    int size = 5;
    int** array_2d;

    array_2d = (int**)malloc(sizeof(int)*size);
    if(array_2d==NULL) exit(-1);

    int i;
    for (i = 0; i < size; i++){
        array_2d[i] = (int*)malloc(sizeof(int)*size);;
        printf("Allocated %d. column.\n", i);
    }

    int row, column;
    for ( row = 0; row < size; row++) {
        for( column = 0; column < size; column++) printf("%d ", array_2d[row][column]);
        printf("\n");
    }

    array_2d[0][0] = 1;
    printf("%d\n", array_2d[4][0]);

    return 0;
}

错误

Allocated 0. column.
Allocated 1. column.
Allocated 2. column.
Allocated 3. column.
Allocated 4. column.
-2002258752 21956 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

【问题讨论】:

  • int** array_2d;
  • array_2d = (int**)malloc(sizeof(int)*size); --> array_2d = (int**)malloc(sizeof(int*)*size);
  • 因此这也是错误的:array_2d = (int**)malloc(sizeof(int)*size); .. 这里的元素类型是int *
  • 建议让这个可读性更强,像这样更安全:array_2d = malloc(size * sizeof(*array_2d)) 确定拥有正确的类型你的sizeof() 总是。

标签: c arrays segmentation-fault


【解决方案1】:

这里有个问题:

array_2d = (int**)malloc(sizeof(int)*size);

您想创建一个指向int指针 数组,但您只为int 的数组分配内存。

sizeof(int) != sizeof(int *)(如典型的 64 位系统)的平台上,您不会分配足够的内存,然后超出范围并出现未定义的行为

简单的解决方法是在分配时使用变量本身:

array_2d = malloc(sizeof *array_2d * size);

通过取消对sizeof 运算符的array_2d 的引用,它将等于sizeof(int*),并且您将为size 数量的指向int 的指针分配足够的内存。

【讨论】:

  • 可能值得注意的是,这只是抽象概念意义上的“二维数组”,而不是 C 语言。
  • 我快要纠正第一行了,然后我阅读了整个答案。 :)
【解决方案2】:

您尝试访问下一行中的第 5 个元素,而您已为从 0 到 3 的 4 个元素分配内存。在 C 中,数组索引从 0 开始并继续。 0 为第 1,1 为第 2,依此类推。

printf("%d\n", array_2d[4][0]);

替换为

printf("%d\n", array_2d[3][0]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多