从C指针数组中获取我的值

时间:2014-10-02 02:10:04

标签: c arrays

真的在这里挣扎,无法弄清楚如何从数组中获取我的价值。

我首先声明这个数组,我想要保存一组数字。 IDK为什么大小为64,我只是感到沮丧并给它一个大小。

   char *numberList1[64];

然后我使用我找到的一些代码读入文件。

  FILE * fp;
   char * line = NULL;
   size_t len = 0;
   ssize_t read;
   char string[100];
   int counter = 0;

   printf("\n\nEnter name of File 1: ");
   scanf("%s", string);

   fp = fopen(string, "r");
   if (fp == NULL) {
       printf("invalid filename of %s",string);
       exit(EXIT_FAILURE);
    }
   while ((read = getline(&line, &len, fp)) != -1) {
       numberList1[counter] = line;
       counter++;
   }

现在,如果要在printf("%s",numberList1[counter]);中说出while之类的内容,我会收回所有数据。

然而,当我说下面的内容时,我只会打印出最后一个项目,但有时会有数字。 (vectorLength)。

   int j;
   //vectorLength is the user-entered # of lines/numbers in the file.
   for (j = 0; j < vectorLength; j++) {
       printf("Writing out: %s \n", numberList1[j] );
       //write(pipe1[WRITE], currentNum, bitSize+1);  
   }

即。如果我有数字,1,2,3,4 我会得到:4 4 4 4

我做错了什么???我试图在C中找到理解指针和数组的指南,但我无法弄明白......

2 个答案:

答案 0 :(得分:1)

我相信我找到了问题的根源。

在下面的代码中,您正在将每一行读入line指向的位置的内存中。然后,将指针存储到内存中,并将其存储到数组中的每个索引中。问题是每次读一行时都会覆盖line指向的位置的内存。结果,只有最后读取的值存储在该位置。由于数组中的每个索引都指向同一个位置,因此代码中最后一个循环的每次迭代都将显示相同的值。

char * line = NULL;
while ((read = getline(&line, &len, fp)) != -1) {
   numberList1[counter] = line; // You are storing the pointer here, NOT the value
   counter++;
}

相反,在循环的每次迭代中为数组分配内存(getline会自动执行此操作),并将 指针复制到数组中。

while ((read = getline(&line, &len, fp)) != -1) {
    numberList1[counter] = line;
    line = NULL;
    counter++;
}

确保释放在此过程中分配的所有内存。

答案 1 :(得分:1)

您没有正确准备发送到getline()的参数。根据文件:

  

如果在调用之前将* lineptr设置为NULL并且* n设置为0,则getline()将分配用于存储该行的缓冲区。即使getline()失败,也应该由用户程序释放此缓冲区。

你想要为每一行提供一个新的行缓冲区,并且至少你似乎希望getline()为你做这个,所以,在每次成功读取之后,以及一旦保存返回的返回缓冲区指针在数组中getline(),将行指针清回NULL并将length参数恢复为零:

char * line = NULL;
size_t len = 0;
while ((read = getline(&line, &len, fp)) != -1 && counter < 64) 
{
   numberList1[counter++] = line;
   line = NULL; // <<==== ADDED
   len = 0;     // <<==== ADDED
}

free(line); // note: this is here because, though getline() failed, the
            // documentation for the api mandates its presence.