0

这是我正在使用的代码片段:

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;,然后再次调整代码,它就可以工作。

为什么会这样?(我想做的是创建一个动态大小的数组。)

4

6 回答 6

9

可能至少有 50 个重复项,但找到它们可能并非易事。

无论如何,您正在定义一个指针,但没有内存可以指向. 您正在写入指针在启动时碰巧包含的任何随机地址,从而产生未定义的行为。

此外,您的代码不会编译,因为int *a, int p = 10;在语法上不正确——逗号需要变成分号(或者您可以去掉第二个int,但我不会真的推荐)。

在 C 中,您可能想要使用数组而不是指针,除非您需要动态分配空间(哎呀,重读,您显然确实想要——所以你需要使用malloc来分配空间,比如a = malloc(2);——但是你还想在使用前检查返回值——至少理论上malloc可以返回一个空指针)。在 C++ 中,您可能希望使用 astd::vector而不是数组或指针(它将为您管理动态分配)。

于 2012-06-11T15:35:35.563 回答
3

没有为 分配内存a它只是一个未初始化的指向int 的指针(所以有两个问题)。

因此,当数据存储在该位置时,行为是undefined。这意味着您有时甚至可能不会遇到分段错误/程序崩溃,或者您可能 -> 未定义。(由于 C 不做任何边界检查,它不会提醒你这些问题。不幸的是,C 的优点之一也是它的主要弱点之一,它会很乐意做你所要求的)

于 2012-06-11T15:34:03.503 回答
2

你甚至没有分配内存,所以你正在访问无效的内存......

使用 malloc 为您的数组分配足够的内存:

int* a = (int*) malloc(sizeof(int)*arraySize);
//Now you can change the contents of the array
于 2012-06-11T15:35:06.997 回答
1

您将需要使用 malloc 为该数组分配内存。

如果您希望动态调整大小,则每次希望增加数组大小时都需要使用 realloc 而不破坏已经存在的数据

于 2012-06-11T15:50:28.407 回答
0

首先 a 尚未初始化。它指向什么?没什么,希望为零,但你不知道。

然后您将 1 添加到它并访问该字节。如果 a 为 0,则 a+1 将为 1。内存位置 1 中是什么?

此外,您正在通过一个可寻址的内存单元来增加地址。这可能是也可能不是该机器上整数的大小。

于 2012-06-11T15:38:05.343 回答
0

您必须为阵列分配存储空间。malloc如果你在 C 中使用,new如果它是 C++,或者std::vector<int>如果你真的需要动态数组大小,则使用 C++。

于 2012-06-11T15:34:16.640 回答