我之所以这样做是因为我正在创建一个initialArray,但随后我将它指向一个新数组,而没有释放最初分配的空间。我尝试在将free(initialArray)
指向我的newArray之前执行free(initialArray)
,所以我将释放以前使用的数组-它将像这样:
free(initialArray);
initialArray = newArray;
但我得到了一个核心转储有帮助吗?
#include <stdio.h>
#include <stdlib.h>
#define ENLARGE_SIZE(x, y) x += y
#define SIZE_INCREMENT 10
int *get_set();
int main() {
int i = 0;
int *set = get_set();
printf("Array elements:\n");
while (*(set + i) != '\0') {
printf("%d,%d\n", *(set + i), i);
i++;
}
free(set);
return 1;
}
int *get_set() {
int *initialArray = malloc(sizeof(int) * SIZE_INCREMENT);
int arraySize = 5;
int arrayElementCount = 0;
int scannedInt;
int i = 0;
while (scanf("%d", &scannedInt) != EOF) {
printf("Scanned %d\n", scannedInt);
arrayElementCount++;
if (arraySize == arrayElementCount) {
int *newArray = realloc(initialArray, sizeof(int) * (ENLARGE_SIZE(arraySize, SIZE_INCREMENT)));
initialArray = newArray;
arraySize += SIZE_INCREMENT;
}
*(initialArray + i) = scannedInt;
i++;
}
return initialArray;
}
1条答案
按热度按时间vh0rcniy1#
您正在使用
realloc
扩展数组:realloc
成功,则initialArray
指向的前一个对象已被释放,因此您可以将新分配的对象直接存储到initialArray
。realloc
失败,则newArray
是NULL
,并且原始对象仍然被分配并且可以通过initialArray
访问。如果决定中止该函数,则可以释放它。还要注意这些备注:
*(set + i)
的可读性不如等价的数组表达式set[i]
。除非你被指示只使用前者,否则你更喜欢后者。while (scanf("%d", &scannedInt) != EOF)
不正确。您应该使用以下命令检查转换是否成功:get_set()
应该在分配的数组末尾设置一个0
值。通过指针返回元素的数量可能是一个好主意。get_set
中对数组大小的处理是令人困惑的。把它简化成这样: