出于某种原因,当我重新分配一个数组以将一个项追加到该数组时,它在segfaulting之前只工作两次。当我试图打印数组中的字符串时,就会出现segfault。我现在有一个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个大小调整,但我不知道为什么这适用于两个大小调整,然后当我打印回阵列时segfults。
它主要是如何使用的:
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++;
}
}

最佳答案

在主函数中,当您在函数中检查时,需要将hist的第一个元素设置为NULL

char** hist = malloc(sizeof(char*));
*hist = NULL;

函数apphist仅局部改变apphist的值。要反映主函数中的更改,需要将指针传递到arr即3D指针arr
您应该始终检查char ***arr的结果并对失败执行操作。
函数的代码如下。
void apparr(char*** arr2, char* line) {
    int length = 0;
    char **arr = *arr2;
    while(arr[length] != NULL) {
        length++;
    }
    arr = realloc(arr, sizeof(char*) * (length+2));
    if (arr == NULL) {
        exit(1); // handle error
    }
    *arr2 = arr;
    arr[length] = line;
    arr[length+1] = NULL;
}

或者,可以返回指向char的指针的指针,并在main中更新该值。
char** apparr(char** arr, char* line) {
    int length = 0;
    char **temp;
    while(arr[length] != NULL) {
        length++;
    }
    temp = realloc(arr, sizeof(char*) * (length+2));
    if (temp == NULL) {
        exit(1); // handle error
    }
    arr = temp;
    arr[length] = line;
    arr[length+1] = NULL;
    return (arr);
}

//in main
hist = apphist(hist, linep1);
hist = apphist(hist, linep2);

关于c - 重新分配只能工作两次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58297107/

10-11 15:17