使用命令编译了以下代码片段:
gcc -g -std=c99 src.c
src.c:
#include <stdio.h>
#include <stdlib.h>
void fill(int* arr, int len, int val) {
for (int i = 0; i < len; ++i) arr[i] = val;
}
int main()
{
printf("Hello World\n");
int *p1, *p2;
int *arr1 = malloc (sizeof(int) * 10);
int *arr2 = malloc (sizeof(int) * 10);
printf("BEFORE======================\narr1=%p, arr2=%p\n", arr1,arr2);
fill(arr1, 10, 17);
fill(arr2, 10, 23);
p1 = &arr1[9];
p2 = &arr2[9];
printf("values at addresses %p, %p are respectively: %d, %d\n", p1, p2, *p1, *p2);
arr1 = realloc(arr1, 200);
arr2 = realloc(arr2, 200);
printf("AFTER======================\narr1=%p, arr2=%p\n", arr1,arr2);
fill(arr1, 200, 239);
fill(arr2, 200, 347);
printf("values at addresses %p, %p are respectively: %d, %d\n", p1, p2, *p1, *p2);
p1 = &arr1[99];
p2 = &arr2[99];
printf("values at addresses %p, %p are respectively: %d, %d\n", p1, p2, *p1, *p2);
free(arr2);
free(arr1);
return 0;
}
我只是尝试动态内存分配。令我惊讶的是,arr2 上的免费通话崩溃了。 从内存转储看来,重新分配后,数组是重叠的,我不确定为什么。
realloc
的第二个参数是以字节为单位的大小。
因此在这一行中:
arr1 = realloc(arr1, 200);
arr2 = realloc(arr2, 200);
您为
arr1
和 arr2
分配了 200 个字节,而不是元素。
要修复它,请将其更改为:
arr1 = realloc(arr1, sizeof(int) * 200);
arr2 = realloc(arr2, sizeof(int) * 200);