【发布时间】:2015-01-20 07:03:02
【问题描述】:
我正在使用 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;
}
为什么这不起作用以及我的代码有什么问题?
【问题讨论】:
-
使用这个 GCC 命令行:
gcc -Wall -Werror -g main.c这将启用警告,并在您的可执行文件中包含调试信息。然后使用gdb a.out在调试器中运行您的代码。键入c以“继续”。然后它会准确指出您的程序崩溃的位置。 -
您是否尝试过使用调试器?什么时候出现错误?
-
你从未初始化过
i。 -
请注意,当您使用
realloc()时,如a = (int*)realloc(a, cont * sizeof(int));所示,如果重新分配失败,您将面临内存泄漏的风险。那是因为当它失败时,它会用 NULL 覆盖a,这意味着你已经丢失了指向内存的旧指针。始终使用int *new_a = (int *)realloc(a, cont * sizeof(int)); if (new_a != 0) a = new_a;,以便在出现问题时仍然可以释放先前分配的内存。这段代码无关紧要。一般来说,它确实很重要。通常最好在标准错误流上报告错误,并避免使用goto。
标签: c pointers memory-management