【问题标题】:Why is the first value of the array being replaced?为什么要替换数组的第一个值?
【发布时间】:2019-03-31 22:01:21
【问题描述】:

我不明白为什么当“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!

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

【问题讨论】:

  • arr[i] = word; 可能不符合您的要求。使用strcpy 复制字符串。

标签: c pointers memory dynamic


【解决方案1】:

您使用arr[i] = (char *)malloc(sizeString * sizeof(char)); 分配了一些内存。然后您立即用arr[i] = word 覆盖该指针(泄漏内存),因此arr[i] 现在指向line 缓冲区中的某个位置。

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

strcpy_s(arr[i], sizeString * sizeof(char), word);

【讨论】:

    【解决方案2】:

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

    arr[i] = word 不是您在 C 中复制字符串的方式。看看strcpy,或者更好的是strncpy

    在完成arr[i] = (char *)malloc 之后立即执行arr[i] = word 会使malloc 完全无用。这完成的唯一事情是分配空间,然后将指针扔掉,从而产生内存泄漏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-17
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 2014-10-22
      • 1970-01-01
      相关资源
      最近更新 更多