下面的代码是我试图实例化一个二维数组,并且它实例化不正确: 代码:
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]
答案 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