C中动态大小的数组

时间:2012-06-11 15:32:18

标签: c++ c arrays pointers

以下是我正在使用的代码段:

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;,然后再次调试代码就行了。

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

6 个答案:

答案 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是什么?

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