我有这样的代码:
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我不知道,哪里有问题。谢谢你的帮助。
发布于 2013-11-24 13:08:32
在aero[i]=(double*)realloc(aero[i],2*sizeof(double))中,如果是i == n,那么aero[i]是未初始化的。不应该对未初始化的指针调用realloc。
发布于 2013-11-24 13:10:05
您从不将新的malloced缓冲区分配给aero[1],而是将其中的垃圾传递给realloc。也许您期望realloc for aero将内存变为零?
发布于 2013-11-24 13:26:57
您的具体问题是,realloc是一个指针,aero[n],它从一开始就没有被malloc编辑过(也不一定是空的)。这是灾难的秘诀。
你还有另外一个问题,尽管这更多的是一个不必要的工作问题,而不是一个致命的缺陷。当循环中的每个aero[]变量实际上在内容或大小上没有变化时,您将重新分配它们。在我看来,在循环中所需要做的就是简单地增加第一级内存aero的大小,并为其新元素分配内存:
while (1) {
aero = realloc (aero, (n+1) * sizeof (double*));
aero[n] = malloc (2 * sizeof (double));
:您会注意到,我已经删除了malloc返回值的转换。这种铸造是错误的C,因为它可以隐藏某些微妙的错误。C完全能够隐式地将void*返回值转换为任何其他指针类型。
当然,您永远也不应该假设您的内存分配会正常工作--我将检查NULL的返回值,并在找到返回值时立即退出。
我唯一的其他问题(当然,除了我不会读捷克语)是将char sep设置为NULL。NULL通常是为指针而不是字符保留的,所以如果将它初始化为\0,它看起来更明智。
https://stackoverflow.com/questions/20174771
复制相似问题