我问是因为我正在创建一个 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;
}
T你正在使用
realloc
来扩展数组:
如果
realloc
成功,之前initialArray
指向的对象已经被释放,所以你可以直接将新分配的对象存储到initialArray
中。
如果
realloc
失败,newArray
是NULL
并且原始对象仍然被分配并且可以通过initialArray
访问。如果您决定中止该功能,您可以释放它。
另请注意这些备注:
语法
*(set + i)
比等效的数组表达式set[i]
可读性差。除非指示您只使用前者,否则最好使用后者。
while (scanf("%d", &scannedInt) != EOF)
不正确。您应该检查是否成功转换:
while (scanf("%d", &scannedInt) == 1)
get_set()
应该在分配的数组末尾设置一个 0
值。通过指针返回元素的数量可能是个好主意。
您对
get_set
中数组大小的处理令人困惑。以这种方式简化它:
#define SIZE_INCREMENT 10
int *get_set(void) {
int arraySize = SIZE_INCREMENT;
int arrayElementCount = 0;
int *array = malloc(sizeof(int) * arraySize);
int scannedInt;
if (!array) {
fprintf(stderr, "allocation error\n");
return NULL;
}
while (scanf("%d", &scannedInt) == 1) {
printf("Scanned %d\n", scannedInt);
if (arrayElementCount + 1 > arraySize) {
int *newArray = realloc(array, sizeof(int) * (arraySize + SIZE_INCREMENT));
if (newArray == NULL) {
fprintf(stderr, "allocation error\n");
free(newArray);
return NULL;
}
array = newArray;
arraySize += SIZE_INCREMENT;
}
array[arrayElementCount++] = scannedInt;
}
array[arrayElementCount] = 0;
return array;
}