malloc 和 realloc 分段错误
malloc and realloc segmentation fault
我正在研究 linux 并用作编译器 gcc。
我对函数 malloc 和 realloc 进行了一些体验,试图了解它是如何工作的。但是当我执行程序时给我分段错误。
接下来我的代码:
#include<stdio.h>
#include<stdlib.h>
int main(){
register int cont=1;
int i,n,*a;
a=(int*)malloc(sizeof(int));
scanf("%d",&n);
while(n!=0){
if(a!=NULL)
a=(int*)realloc(a,cont*sizeof(int));
else
goto exit;
a[i]=n;
scanf("%d",&n);
cont++;
i++;
}
for(i=0;i<cont;i++)
printf("%d\n",a[i]);
free(a);
return 0;
exit: printf("No memory\n");
free(a);
return -1;
}
为什么这不起作用,我的代码有什么问题?
i
从未初始化,因此 a[i]=n;
可能导致分段错误。将其更改为:
int i = 0;
可以对您的代码进行一些其他改进,例如 don't cast the result of malloc
,我认为您使用 goto
看起来没有必要,register
关键字是可能没用。
在 while 循环中,用户输入 0 后,它存储在 n
中,您递增 cont
并且当 while 循环再次检查输入条件时 n != 0
它失败(因为现在 n 的值为 0)并退出循环而不将 n
值存储到 a
,这就是为什么您在输出的最后一个位置获得不确定值的原因。
当你使用 realloc 时,你不应该将 return 值直接存储到你试图增加大小的指针变量中,因为 realloc return NULL 在失败时,你最终将 handle/address 擦除到内存缓冲区。
register int cont = 1;
int i = 0,n,*a;
int *temp;
a = (int*)malloc(sizeof(int));
if(a == NULL) goto exit;
while(1){
scanf("%d", &n);
temp = (int*)realloc(a, cont * sizeof(int));
if(temp == NULL)
goto exit;
else
a = temp;
a[i++] = n;
if(n == 0) // put the condition here if u want to store 0
break;
else
cont++;
}
我正在研究 linux 并用作编译器 gcc。 我对函数 malloc 和 realloc 进行了一些体验,试图了解它是如何工作的。但是当我执行程序时给我分段错误。 接下来我的代码:
#include<stdio.h>
#include<stdlib.h>
int main(){
register int cont=1;
int i,n,*a;
a=(int*)malloc(sizeof(int));
scanf("%d",&n);
while(n!=0){
if(a!=NULL)
a=(int*)realloc(a,cont*sizeof(int));
else
goto exit;
a[i]=n;
scanf("%d",&n);
cont++;
i++;
}
for(i=0;i<cont;i++)
printf("%d\n",a[i]);
free(a);
return 0;
exit: printf("No memory\n");
free(a);
return -1;
}
为什么这不起作用,我的代码有什么问题?
i
从未初始化,因此 a[i]=n;
可能导致分段错误。将其更改为:
int i = 0;
可以对您的代码进行一些其他改进,例如 don't cast the result of malloc
,我认为您使用 goto
看起来没有必要,register
关键字是可能没用。
在 while 循环中,用户输入 0 后,它存储在 n
中,您递增 cont
并且当 while 循环再次检查输入条件时 n != 0
它失败(因为现在 n 的值为 0)并退出循环而不将 n
值存储到 a
,这就是为什么您在输出的最后一个位置获得不确定值的原因。
当你使用 realloc 时,你不应该将 return 值直接存储到你试图增加大小的指针变量中,因为 realloc return NULL 在失败时,你最终将 handle/address 擦除到内存缓冲区。
register int cont = 1;
int i = 0,n,*a;
int *temp;
a = (int*)malloc(sizeof(int));
if(a == NULL) goto exit;
while(1){
scanf("%d", &n);
temp = (int*)realloc(a, cont * sizeof(int));
if(temp == NULL)
goto exit;
else
a = temp;
a[i++] = n;
if(n == 0) // put the condition here if u want to store 0
break;
else
cont++;
}