在C中将指针数组存储在指针数组中

时间:2017-10-26 19:00:08

标签: c arrays pointers

我有一个指针数组,我想暂时将内容存储到另一个指针数组中,但我不确定如何,一切都给我分段错误。

类似的东西:

char *records[6], *temp[6];

for(int i=0; i<6; i++){
    fgets(temp[i], 999, fp); // Filling array with opened file line by line
    records[i]=temp[i];
}

当我使用* temp时,记录完全被我文件的最后一行填充。

2 个答案:

答案 0 :(得分:2)

您忘记为读入的每一行分配内存。请注意,您的数组char *temp[6]会为6个指针保留内存,但它不会为这些指针所指向的位置保留任何内存。所以temp的每个成员,例如第一个temp[0],指向不允许写入的地方。因此,第一个fgets(temp[i], 999, fp)已经产生了未定义的行为,很可能是一个段错误。

要解决此问题,请读入缓冲区,然后根据行长保留内存并复制内容:

char *records[6] = { 0 };
char buffer[999];

for(int i=0; i<6; i++){
    if (fgets(buffer, 999, fp) == NULL)
       break;

    records[i] = malloc(strlen(buffer) + 1);
    strcpy (records[i], buffer);
}

进一步注意,应考虑fgets的返回值,如果遇到NULL之类的错误,则为EOF。此外,更正了错误i++而非i+

答案 1 :(得分:1)

你应该为行分配内存 - 目前两个数组中的指针都没有指向任何东西(此外,它们是单元化的,意味着它们的值未定义)。
您可以动态地(使用malloc)执行此操作,也可以声明一个2d char数组,其中每个子数组(行)都是一个字符串。

char records[6][999] = { 0 }, temp[6][999] = { 0 };
...