C++ C语言中的动态大小数组

C++ C语言中的动态大小数组,c++,c,arrays,pointers,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已停止工作。 如果我注释掉第二行代码intp=10然后再次对代码进行tun,它将正常工作 为什么会这样?(我想做的是创建一个动态大小的数组。)没有为a分配内存,它只是一个指向int的未初始化指针(

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

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已停止工作。 如果我注释掉第二行代码
intp=10
然后再次对代码进行tun,它将正常工作

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

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


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

您必须为阵列分配存储。如果你在C中,使用<代码> MalOC 如果是C++,或者使用C++ <代码> STD::vector < /COD>如果你真的需要数组的大小是动态的。< /P> < P>你甚至没有分配内存,所以你正在访问无效的内存……/P> 使用malloc为阵列分配足够的内存:

int* a = (int*) malloc(sizeof(int)*arraySize);
//Now you can change the contents of the array

可能至少有50个副本,但找到它们可能不是一件小事

不管怎样,您正在定义一个指针,但没有内存让它指向。您正在写入指针在启动时碰巧包含的任意随机地址,从而产生未定义的行为

而且,您的代码不会编译,因为
int*a,intp=10
在语法上不正确——逗号需要变成分号(或者你可以去掉第二个
int
,但我不建议这样做)


在C语言中,您可能希望使用数组而不是指针,除非您需要动态分配空间(oops,rereading,您显然确实想要——因此您需要使用
malloc
来分配空间,如
a=malloc(2)
--但是在使用它之前,您还需要检查返回值-,至少在理论上,
malloc
可以返回空指针)。在C++中,您可能希望使用<代码> STD::vector < /COD>而不是数组或指针(它将管理动态分配)。

第一个A尚未初始化。它指的是什么?没有,希望是零,但你不知道

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


此外,您还通过一个可寻址的内存单元来缓冲地址。这可能是该计算机上整数的大小,也可能不是。

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


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

访问统一化指针。这是未定义的行为。您也可以在C中使用
realloc
。它很昂贵,但它是动态的。@Kernald:昂贵,但不一定比
malloc
贵(事实上,
malloc(x)
相当于
realloc(NULL,x)
)。@Kernald:使用
realloc
只能解决一半的问题,因为您可以使用它来动态调整内存区域的大小。问题的另一半是跟踪数组的大小以及其中有多少项。当您使用
std::vector
时,它可以同时为您提供这两种功能。@Brian McFarland:这就是为什么我指定了“在C中”。但是我同意,这就是为什么
std::vector
被制作的原因。是的,我得到了内存分配点。然而,该程序在语法上是正确的。我用了一个
而不是
。已进行有问题的编辑以更正它。所以,我仍然不明白为什么删除了delcaration为
p
的行后,代码在没有内存分配的情况下工作。@Jatin:未定义的行为意味着几乎任何事情都可能发生——包括代码看起来正常工作,这似乎就是这里发生的事情。从听起来,你的指针碰巧包含了一个可用的地址,而不是(当时)用于任何其他重要的事情。当看似无关的更改导致(或停止)破坏时,这是未定义行为的一个很好的迹象。是的,我得到了内存分配点。然而,该程序在语法上是正确的。我用了一个
而不是
。已进行有问题的编辑以更正它。所以,我仍然不明白为什么当delcaration为p的行被删除时,代码在没有内存分配的情况下工作removed@Jatin我打赌如果你运行1000次,它可能没有。或者可能是由于编译器如何为变量分配内存的偶然性。如果您将
p
的声明移到
a
上方,该怎么办?它仍然有效吗?不幸的是,这就是未定义行为的问题。@Jatin例如,我刚刚用
p=10注释掉了这行,它崩溃了。。所以在这两种情况下。这是LinuxWell下的GCC4.4.3版本,我在Windows上使用code::blocks,如果我将
p
的声明移到
a
@Jatin上面,它就会起作用,这只是确认了未定义行为的含义。。否则,跨平台的行为将是一致的(或应该是一致的)。