【问题标题】:Can someone find the mistake? Pure C realloc有人能找出错误吗?纯 C 重新分配
【发布时间】:2013-11-24 13:03:58
【问题描述】:

我有这个代码:

int main() {
   int i=0, n=0;
   char sep=NULL;
   double **aero=(double**)malloc(sizeof(double*));
   *aero=(double*)malloc(2*sizeof(double));
   printf("Zadejte souradnice:\n");
   while (1) {
      aero=(double**)realloc(aero,(n+1)*sizeof(double*));
      for (i=0; i<n+1; i++) {
          aero[i]=(double*)realloc(aero[i],2*sizeof(double));
      }
      if ((scanf("[%lf,%lf]%c",&aero[n][0],&aero[n][1],&sep))==3 && (sep=='\n' || sep==' '))      {
            n++;     
            continue;
      } else if (!feof(stdin)) {
            printf("Nespravny vstup.\n");
            freeArray2D(aero,n);
            return 0;
      }
      break;
   }
}

它工作正常,但我只能扫描坐标(格式:[x,y])19 次。然后它向我显示分段错误(核心转储)。我使用 Linux 编译器 gcc -Wall -pedantic main.c -lm 我不知道,问题出在哪里。感谢您的帮助。

【问题讨论】:

标签: c malloc scanf realloc


【解决方案1】:

您永远不会将新的malloced 缓冲区分配给aero[1],而是将其中的垃圾传递给realloc。也许您希望aerorealloc 将内存初始化为零?

【讨论】:

    【解决方案2】:

    aero[i]=(double*)realloc(aero[i],2*sizeof(double)) 中,如果i == n,则aero[i] 未初始化。不应在未初始化的指针上调用 realloc

    【讨论】:

      【解决方案3】:

      你的具体问题是你realloc 一个指针aero[n],它从来没有被malloced 摆在首位(不一定是NULL)。这是灾难的根源。

      您还有另一个问题,尽管它更像是一个不必要的工作问题而不是致命缺陷。当 aero[] 变量实际上并没有改变内容 大小时,您将重新分配循环中的每一个变量。在我看来,您在循环中需要做的只是增加第一级内存aero 的大小并为其新元素分配内存:

      while (1) {
          aero = realloc (aero, (n+1) * sizeof (double*));
          aero[n] = malloc (2 * sizeof (double));
          :
      

      您会注意到我已经删除了 malloc 返回值的转换。这种转换在 C 中是不明智的,因为它可以隐藏某些细微的错误。 C 完全能够将void* 返回值隐式转换为任何其他指针类型。

      当然,你应该永远假设你的内存分配会起作用 - 我会检查 NULL 的返回值,如果我找到了就立即退出。

      我遇到的唯一其他问题(当然,除了我无法阅读捷克语)是 char sepNULL 的设置。 NULL 通常是为指针而不是字符保留的,所以如果将它初始化为 \0 看起来更合理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多