C ++简单操作后的堆损坏

时间:2015-11-22 06:08:02

标签: c++ pointers heap

我无法理解为什么使用我的数组的简单操作会破坏堆。

例如,此代码可以正常工作:

double *matrix = (double*)(malloc(50));

free(matrix);

然后,我尝试修改这个数组的一些元素:

double *matrix = (double*)(malloc(50));

for (int i = 0; i < 20; matrix++, i++) {
    *matrix = (double)i;
}

free(matrix);

问题是即使这段代码根本不起作用。 (VS告诉我堆已损坏)。可能这是一个愚蠢的错误,但我对所有这些行动都很陌生。

更新

现在我的代码看起来像这样:

double *matrix = (double*)malloc(sizeof(double) * 50);

但我收到此错误消息:

enter image description here

2 个答案:

答案 0 :(得分:2)

你的malloc做了什么被分配50个字节,而不是50个双倍。以下是如何使用malloc的示例:

myVar = (double*)malloc (sizeof(double));

或者如果你想使用double(array)double,那么你可以这样做:

myVar = (double*)malloc (sizeof(double) * 50);

答案 1 :(得分:2)

您的代码修改了指针&#34;矩阵&#34;在你释放它之前,我认为这是一种未定义的行为。

没有冒犯,但我建议你得到一本关于c ++的好书。 &#34;的malloc&#34;不是c ++中动态内存分配的首选方式。

无论如何,如果你想作为一个数组访问内存块,最好的方法是使用operator []:

for (int i = 0; i < 20; i++) {
    matrix[i] = (double)i;
} 

是的,正如@Hernantas所提到的,如果你想为50个双重对象分配空间,请使用

myVar = malloc (sizeof(double) * 50);