首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有人能发现这个错误吗?纯C现实

有人能发现这个错误吗?纯C现实
EN

Stack Overflow用户
提问于 2013-11-24 13:03:58
回答 3查看 133关注 0票数 1

我有这样的代码:

代码语言:javascript
复制
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;
   }
}

它工作得很好,但我只能扫描19次坐标(格式: x,y)。然后,它显示了分割错误(核心丢弃)。我使用Linux编译器gcc -Wall -pedantic main.c -lm我不知道,哪里有问题。谢谢你的帮助。

EN

回答 3

Stack Overflow用户

发布于 2013-11-24 13:08:32

aero[i]=(double*)realloc(aero[i],2*sizeof(double))中,如果是i == n,那么aero[i]是未初始化的。不应该对未初始化的指针调用realloc

票数 1
EN

Stack Overflow用户

发布于 2013-11-24 13:10:05

您从不将新的malloced缓冲区分配给aero[1],而是将其中的垃圾传递给realloc。也许您期望realloc for aero将内存变为零?

票数 1
EN

Stack Overflow用户

发布于 2013-11-24 13:26:57

您的具体问题是,realloc是一个指针,aero[n],它从一开始就没有被malloc编辑过(也不一定是空的)。这是灾难的秘诀。

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

代码语言:javascript
复制
while (1) {
    aero = realloc (aero, (n+1) * sizeof (double*));
    aero[n] = malloc (2 * sizeof (double));
    :

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

当然,您永远也不应该假设您的内存分配会正常工作--我将检查NULL的返回值,并在找到返回值时立即退出。

我唯一的其他问题(当然,除了我不会读捷克语)是将char sep设置为NULLNULL通常是为指针而不是字符保留的,所以如果将它初始化为\0,它看起来更明智。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20174771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档