以下是我正在使用的代码段:
int *a;
int p = 10;
*(a+0) = 10;
*(a+1) = 11;
printf("%d\n", a[0]);
printf("%d\n", a[1]);
现在,我希望它能打印
10
11
但是,会出现一个窗口,显示program.exe已停止工作。
如果我注释掉第二行代码int p = 10;
,然后再次调试代码就行了。
为什么会这样? (我想要做的是创建一个动态大小的数组。)
答案 0 :(得分:9)
这可能至少有50个重复,但找到它们可能并不重要。
无论如何,你正在定义一个指针,但没有内存可以指向 。您正在写入指针在启动时包含的任何随机地址,从而产生未定义的行为。
此外,您的代码将无法编译,因为 int *a, int p = 10;
在语法上不正确 - 逗号需要成为分号(或者您可以删除第二个int
,但我真的不建议这样做。
在C中,您可能希望使用数组而不是指针,除非您需要动态分配空间(oops,重读,您显然确实需要 - 因此您需要使用malloc
来分配空格,如a = malloc(2);
- 但你也想在使用之前检查返回值 - 至少在理论上,malloc
可以返回空指针)。在C ++中,您可能希望使用std::vector
而不是数组或指针(它将为您管理动态分配)。
答案 1 :(得分:3)
没有为a
分配内存,它只是一个未初始化的指针到一个int(所以有两个问题)。
因此,当数据存储在该位置时,行为未定义。这意味着您有时甚至可能无法获得分段错误/程序崩溃,或者您可能 - >未定义。 (由于C不做任何边界检查,它不会提醒你这些问题。不幸的是,C的优点之一也是它的主要弱点之一,它会很乐意按你的要求行事)< / p>
答案 2 :(得分:2)
你甚至没有分配内存,所以你正在访问无效的内存......
使用malloc为您的阵列分配足够的内存:
int* a = (int*) malloc(sizeof(int)*arraySize);
//Now you can change the contents of the array
答案 3 :(得分:1)
您需要使用malloc为该阵列分配内存。
如果你希望动态大小,你需要在每次希望增加数组大小而不破坏已经存在的数据时使用realloc
答案 4 :(得分:0)
您必须为阵列分配存储空间。如果您在C中,请使用malloc
,如果是C ++则使用new
,如果您确实需要数组大小是动态的,请使用C ++ std::vector<int>
。
答案 5 :(得分:0)
首先a尚未初始化。它指向什么?没什么,希望是零,但你不知道。
然后你向它添加1并访问该字节。如果a为0,则+ 1将为1.内存位置1是什么?
此外,您通过一个可寻址的内存单元来触发地址。这可能是也可能不是该机器上整数的大小。