#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]);
}
В приведенном выше коде я создаю базу данных имен. Для этого я использую динамическое распределение памяти. Я выделяю память для 2D-массива, используя массив методов указателей. Когда я выполняю эту программу на gcc компилятор, я получаю ошибка сегментации. Я не понимаю, почему это происходит? Не могли бы вы рассказать мне, где ошибка?Значение двойного указателя и тройного указателя в этом фрагменте кода
В дополнение к тому, что уже упоминалось в ответах ниже о том, что переменная 'p' является локальной в функции' add', я уверен, что вы должны инициализировать 'p = malloc (...)' для начала, поскольку функция 'realloc' ожидает (как входной аргумент) указателя на сегмент памяти, ранее выделенного либо' malloc', либо 'realloc'. –
Некоторые подсказки: используйте отладчик, последовательно отступайте от своего кода, избегайте 'get', не бросайте возвращаемые значения' malloc'/'realloc',' sizeof (char) 'всегда 1. –
@barakmanos: My C standard говорит: «Если' ptr' - нулевой указатель, функция 'realloc' ведет себя как функция' malloc'. Но все же, если 'print' вызывается без предшествующего' add', указатель равен 0. –