创建有问题的二维数组(C)

时间:2010-10-27 02:45:02

标签: c multidimensional-array

下面的代码是我试图实例化一个二维数组,并且它实例化不正确: 代码:

    FILE* kernalFile = fopen(argv[1], "r");
    int rKernalSize;
    fscanf(kernalFile, "%d", &rKernalSize);
    unsigned int rKernal[rKernalSize][rKernalSize];

运行该代码后的数据断点: rKernalSize VALUES:

Name : rKernalSize
    Details:3
    Default:3
    Decimal:3
    Hex:0x3
    Binary:11
    Octal:03

rKernal价值观:

Name : rKernal
    Details:0x7ffffffe0cd0
    Default:[0]
    Decimal:[0]
    Hex:[0]
    Binary:[0]
    Octal:[0]

rKernal[][0]

它应该是rKernal[3][3],这是文件,所以你可以查看它。如果需要:

3 -1 1 0 1 0 -1 0 -1 1 3 -1 1 0 1 0 -1 0 -1 1 3 -1 1 0 1 0 -1 0 -1 1

TLDR:rKernalSize是正确的(3)但是当我用rKernal[rKernalSize][rKernalSize]创建2d数组时,它没有正确实例化!它将rKernal[][0]设置为默认值,但应为rKernal[3][3]

2 个答案:

答案 0 :(得分:2)

忘记调试器告诉你的内容。在您的代码中,紧接着:

unsigned int rKernal[rKernalSize][rKernalSize];

发表声明:

printf ("%d\n", sizeof(rKernal) / sizeof(unsigned int));

并查看打印出来的内容(希望9)。

在编译时创建的调试信息可能不足以正确确定可变长度数组的大小。


举例来说,即使gcc支持可变长度数组,gdb本身也无法在2009年末就正确处理它们,并且在2010年10月的文档中仍然没有提及它们

所以我怀疑问题,特别是因为我在上面提供的测试代码按预期输出9

答案 1 :(得分:1)

这里的基本问题是,在分配该数组时,编译时不知道rKernalSize。在编译时,int rKernalSize的值依赖于编译器(除非新的C标准明确地使其为0; 0是我打赌的值。)因此,当加载代码时,有一个符号{{ 1}}表示不包含字节的内存部分的地址。

然后你运行程序,用你的scanf读'3';当你转储结果时,你会看到'3'。

顺便说一下,这段代码在直接C中不起作用 - 你必须在第一个可执行语句之前分配。这将在C ++中编译。

现在,如果你想使用直接C来做这样的事情,这就是你需要的:

  • 使用scanf读取您的尺寸。

  • 使用rKernal为您的数组分配内存,它看起来像

X

malloc
  • 现在,由于C中的指针数组二元性,您可以将其视为数组 X

    int ** ary; int rkSize; // what you scanf'd into if((ary = malloc(rkSize*rkSize*sizeof(unsigned int)))==NULL){ // for some reason your malloc failed. You can't do much fprintf(stderr,"Oops!\n"); exit(1); } // If you got here, then you have your array