【问题标题】:realloc not changíng size of array [duplicate]realloc 不改变数组的大小
【发布时间】:2012-10-01 07:36:58
【问题描述】:

可能重复:
Realloc is not resizing array of pointers

谁能告诉我我的错误在哪里?此函数应创建一个由stdin 提供的字符组成的数组。我阅读了一些相关的问题,但它太复杂了,我无法理解。

char *readChar(void)
{
    int c;
    int len = 0;
    char* parr = malloc(sizeof(char));

    while((c = getchar()) != EOF)
    {
        ++len;
        int size = sizeof(char)*len;
        parr = (char *) realloc(parr,size);
        *(parr+size-1) = (char) c;
        printf("Done! Size should be: %dB, but real size is %dB\n",size,sizeof(parr));
    }

    return parr;
}

输出:

完成!大小应该是:1B,但实际大小是 8B 完毕!大小应该是:2B,但实际大小是 8B 完毕!大小应该是:3B,但实际大小是 8B 完毕!大小应该是:4B,但实际大小是 8B

【问题讨论】:

    标签: c arrays realloc


    【解决方案1】:

    错误在于sizeof() 不会告诉您分配的字节数。它告诉你char *的大小

    听起来您想要验证您分配的内存量是否正确。 sizeof() 不会给你这些信息。此时处于低级细节中,您需要做一些依赖于操作系统的操作来尝试查找该信息。 (例如,在 Linux 内核中,如果你 kmalloc() 内存,你可以使用 ksize() 来找出你得到了多少字节)

    【讨论】:

      【解决方案2】:

      sizeof(parr) 不是分配的空间量,它是char* 的大小(parr 的数据类型)。了解您分配的内存量的唯一可移植方法是自己跟踪它。

      假设realloc 按预期工作,您分配的字节数将等于您的变量size

      我在您的代码中注意到的其他几件事:

          char* parr = malloc(sizeof(char));
      

      您应该始终检查malloc 的返回值以确保它成功:

       char* parr;
       if(!(par = malloc(sizeof(char)))
       {
           //allocation failed
       }
      

      你代码的下一部分引起了我的注意:

       int size = sizeof(char)*len;
      

      这实际上是不需要的。 sizeof(char) 始终等于一个字节,因此您不妨只使用 len 的当前值,而不是在循环的每次迭代中声明一个等于 len * 1 的新变量。

        parr = (char *) realloc(parr,size);
      

      如前所述,您不需要使用size,因为它等同于len。同样在 C 中,转换指针通常不是一个好主意,您还应该检查 realloc 的返回值,以防它失败:

      if(!(parr = realloc(parr, size)))
      {
          //allocation failed
      }
      

      最后一点,我在使用realloc 函数时总是使用缓冲区以避免潜在的内存问题。这是我对您的代码的看法:

      char *readChar(void)
      {
          int c, len = 0;
          char* parr = NULL, char *tmp;
      
          if(!(parr = malloc(sizeof(char)))
          {
              fputs("memory allocation failed", stderr);
              exit(1);
          }
      
          while((c = getchar()) != EOF)
          {
              ++len;
              if(!(tmp = realloc(parr, len)))
              {
                  free(parr);
                  fputs("memory allocation failed", stderr);
                  exit(1);
              }
              parr = tmp;
              *(parr+len-1) = (char) c;
          }
          return parr;
      }
      

      【讨论】:

        【解决方案3】:

        sizeof(parr) 返回一个指针大小(在您的系统上为 8 个字节)。您需要使用strlen 来找出实际的字符串大小(注意,字符串应以\0 结尾,即以空值结尾)。

        【讨论】:

          【解决方案4】:

          您无法使用 sizeof() 测量动态分配数组的大小,因为它是在编译期间评估的。在您的示例中,您使用的是 pointer 的大小,在 x64 架构上为 8B。

          【讨论】:

            【解决方案5】:

            它为您提供sizeof 指针,每次打印时该指针始终相同。

            没有办法知道指针指向的内存大小,您只需要自己跟踪它们即可。

            顺便说一句,sizeof(char) 始终为 1。因此,您可以在对 reallocmalloc 的调用中删除它们。为了安全起见,您还应该检查 malloc 和 realloc 的返回值。

            【讨论】:

              猜你喜欢
              • 2014-04-09
              • 1970-01-01
              • 2017-08-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-03-27
              • 2015-04-03
              • 1970-01-01
              相关资源
              最近更新 更多