【发布时间】:2014-12-03 12:18:24
【问题描述】:
#include<stdio.h>
#include<stdlib.h>
void add(char **p);
void print(char **p);
int cnt=0;
main()
{
int option;
char **p=NULL;
while(1)
{
printf("------MENU-----\n");
printf("1>input\n 2>print\n3>exit\n");
printf("enter ur choice\n");
scanf("%d",&option);getchar();
switch(option)
{
case 1: add(p);
break;
case 2: print(p);
break;
case 3: return;
default: printf("Invalid option\n");
}
}
}
void add(char **p)
{
int i;
p=(char**)realloc(p,(cnt+1)*sizeof(char*));
if(p==NULL)
{
printf("Error: memory not available\n");
return;
}
p[cnt]=NULL;
p[cnt]=(char*)realloc(p[cnt],20*sizeof(char));
puts("enter a name");
gets(p[cnt]);
cnt++;
printf("cnt=%d\n",cnt);
}
void print(char **p)
{
int i;
for(i=0;i<cnt;i++)
printf("p[%d]=%s\n",i,p[i]);
}
在上面的代码中,我正在创建一个名称数据库。为此,我使用动态内存分配。我正在使用指针数组方法为二维数组分配内存。当我在 gcc 编译器 上执行这个程序时,我得到 segmentation fault。我不明白为什么会这样?你能告诉我错误在哪里吗?
【问题讨论】:
-
除了下面的答案中已经提到的关于变量
p在函数add中的本地化之外,我很确定您必须首先初始化p = malloc(...),因为函数realloc期望(作为输入参数)指向先前使用malloc或realloc分配的内存段的指针。 -
一些提示:使用调试器,一致地缩进你的代码,避免
gets,不要转换malloc/realloc的返回值,sizeof(char)总是1。 -
@barakmanos:我的 C 标准说“如果
ptr是空指针,则realloc函数的行为类似于malloc函数。”但是,如果在没有事先add的情况下调用print,则指针为 0。 -
@barakmanos -
realloc可以做到malloc和free可以做到的一切(包括初始分配)。这是从不使用realloc而不是从不使用malloc或free的论据!设计realloc的人都忘记了“做一件事并做好”作为设计原则。 -
@AAT
realloc()可以将内存的内容“复制”到另一个新的逻辑位置,而无需更改物理地址,因为它知道源将被释放。因此不需要出现memcpy()。malloc()和free()将如何执行这种高效的重新分配?
标签: c dynamic-memory-allocation realloc