这是我正在使用的代码片段:
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;
,然后再次调整代码,它就可以工作。
为什么会这样?(我想做的是创建一个动态大小的数组。)
可能至少有 50 个重复项,但找到它们可能并非易事。
无论如何,您正在定义一个指针,但没有内存可以指向. 您正在写入指针在启动时碰巧包含的任何随机地址,从而产生未定义的行为。
此外,您的代码不会编译,因为int *a, int p = 10;
在语法上不正确——逗号需要变成分号(或者您可以去掉第二个int
,但我不会真的推荐)。
在 C 中,您可能想要使用数组而不是指针,除非您需要动态分配空间(哎呀,重读,您显然确实想要——所以你需要使用malloc
来分配空间,比如a = malloc(2);
——但是你还想在使用前检查返回值——至少理论上malloc
可以返回一个空指针)。在 C++ 中,您可能希望使用 astd::vector
而不是数组或指针(它将为您管理动态分配)。
没有为 分配内存,a
它只是一个未初始化的指向int 的指针(所以有两个问题)。
因此,当数据存储在该位置时,行为是undefined。这意味着您有时甚至可能不会遇到分段错误/程序崩溃,或者您可能 -> 未定义。(由于 C 不做任何边界检查,它不会提醒你这些问题。不幸的是,C 的优点之一也是它的主要弱点之一,它会很乐意做你所要求的)
你甚至没有分配内存,所以你正在访问无效的内存......
使用 malloc 为您的数组分配足够的内存:
int* a = (int*) malloc(sizeof(int)*arraySize);
//Now you can change the contents of the array
您将需要使用 malloc 为该数组分配内存。
如果您希望动态调整大小,则每次希望增加数组大小时都需要使用 realloc 而不破坏已经存在的数据
首先 a 尚未初始化。它指向什么?没什么,希望为零,但你不知道。
然后您将 1 添加到它并访问该字节。如果 a 为 0,则 a+1 将为 1。内存位置 1 中是什么?
此外,您正在通过一个可寻址的内存单元来增加地址。这可能是也可能不是该机器上整数的大小。
您必须为阵列分配存储空间。malloc
如果你在 C 中使用,new
如果它是 C++,或者std::vector<int>
如果你真的需要动态数组大小,则使用 C++。