有人能找出错误吗?纯C realloc
我有这个密码:有人能找出错误吗?纯C realloc,c,malloc,scanf,realloc,C,Malloc,Scanf,Realloc,我有这个密码: 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(
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;
}
}
intmain(){
int i=0,n=0;
char sep=NULL;
双倍**航空=(双倍**)malloc(双倍*);
*aero=(双*)malloc(2*sizeof(双));
printf(“Zadejte souradnice:\n”);
而(1){
aero=(双**)realloc(aero,(n+1)*sizeof(双*);
对于aero[i]=(double*)realloc(aero[i],2*sizeof(double))
中的(i=0;i,如果i==n
,则aero[i]
未初始化。您不应该在未初始化的指针上调用realloc
。您永远不会将新的malloc
ed缓冲区分配给aero[1]
,但将垃圾传递到realloc
。也许您希望aero
的realloc
将内存初始化为零?您的具体问题是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
会更合理,请向我们展示一些示例输入,以及freearay2d
函数。检查这可能会有帮助:OT:sep=NULL;
应为空char sep='\0';
或..=0;
。