【发布时间】:2019-10-09 04:31:41
【问题描述】:
由于某种原因,当我重新分配一个数组以将一个项目附加到数组时,它在段错误之前只工作了两次。当我尝试打印数组内的字符串时会发生段错误。我目前有一个 NULL 终止的数组。
void apparr(char** arr, char* line) {
int length = 0;
// find the length of the array
while(arr[length] != NULL) {
length++;
}
// realloc with 2 extra spaces (1 for line, 1 for NULL)
arr = realloc(arr, sizeof(char*) * (length+2));
// set last element (which was NULL) to line
arr[length] = line;
// set the NULL terminator
arr[length+1] = NULL;
}
我不知道我可能在哪里出错,我唯一的猜测是我如何调用 realloc。但是,我会理解不适用于 1 调整大小,但我不知道为什么这适用于两个调整大小,然后当我打印回数组时出现段错误。
如何在 main 中使用:
int main(int argc, char** argv){
char** hist = malloc(sizeof(char**));
char* linep1;
char* linep2;
char* linep3;
char* linep4;
linep1 = (char*)malloc(strlen("test")*sizeof(char));
linep2 = (char*)malloc(strlen("test2")*sizeof(char));
linep3 = (char*)malloc(strlen("test3")*sizeof(char));
linep4 = (char*)malloc(strlen("test4")*sizeof(char));
strcpy(linep1, "test");
strcpy(linep2, "test2");
strcpy(linep3, "test3");
strcpy(linep4, "test4");
apphist(hist, linep1);
apphist(hist, linep2);
//apphist(hist, linep3); //uncommenting this line causes nothing to be printed
//apphist(hist, linep4); //uncommenting this line causes only test4 to be printed
int x = 0;
while (hist[x] != NULL) {
printf("%s\n", hist[x]);
x++;
}
}
【问题讨论】:
-
我希望你没有传递一个实际的数组,因为 realloc 并不打算用于数组。它用于动态内存分配,同时尝试保留相同的基地址。
-
这是一个“malloc”数组指针@Mihir
-
请创建一个minimal reproducible example 重现您遇到的问题。
-
您在本地对
arr进行了更改,这些更改不会反映在调用函数中。 -
@dbush 我传入了一个指向 arr 而不是 arr 的指针。因此,当我重新分配指针时,更改会得到反映。