为什么要替换数组的第一个值?

时间:2019-03-31 22:01:22

标签: c pointers memory dynamic

我不明白为什么当“ i”正确递增时,数组的第一个值在内部while循环之外更改。我是否以某种混乱的方式分配内存?我该如何解决这个问题?

int main(void) 
{
  int sizeArray = 5, sizeString = 10;
  FILE *fin = fopen("file.txt", "r");
  char ** arr = (char **) malloc(sizeArray * sizeof(char *));
  char line[1000];
  char *word;
  int i = 0;
  while(fgets(line, 100, fin) != NULL)
  {
    word = strtok(line, " ");
    while (i < 2)
    {
      arr[i] = (char *)malloc(sizeString * sizeof(char));
      arr[i] = word;
      printf("Inner print: %s\n\n",arr[0]);
      word = strtok(NULL, " ");
      i++;
    }

  }
    printf("This is the final arr[0] (outer print): %s",arr[0]);

}

file.txt读为:

First second.
Third! Fourth

控制台上的打印内容如下:

Inner print: First

Inner print: First

The final arr[0] (outer print): Third!

当我希望外部打印为:首先

2 个答案:

答案 0 :(得分:1)

您使用(require "utils.rkt")分配了一些内存。然后,您立即用arr[i] = (char *)malloc(sizeString * sizeof(char));覆盖该指针(释放内存),以便arr[i] = word现在指向arr[i]缓冲区中的某个位置。

您需要将line指向的字符串复制到为word分配的缓冲区中:

arr[i]

答案 1 :(得分:0)

您需要在外部while循环内移动int i = 0;。或至少在内环完成后将其重置为零。

arr[i] = word不是您在C语言中复制字符串的方式。请看一下strcpy,甚至更好的strncpy

完成arr[i] = word之后立即执行arr[i] = (char *)malloc会使malloc完全无用。完成此操作的唯一方法是分配空间,然后将指针扔掉,从而导致内存泄漏。