2013-12-17 6 views
2

Я хотел бы заполнить массив строк, используя две функции: первая, если у меня есть n строк для выделения, будет выделять n пробелов памяти; второй будет выделять память для каждой строки чтениявыделение памяти массиву строки

Вот первая функция:

char** allocate(int n) 
{ 
    char** t; 
    t=(char**)malloc(n*sizeof(char*)); 
    if(!t) exit(-1); 
    return t; 
} 

Вот второй один:

void fill(char*** t,int n) 
    { 
     int i; 
     char* help=" "; 
     for(i=0;i<n;i++) 
     { 
      printf("\n saisir la chaine n %d :",i+1); 
       scanf("%s",help); 
       *t[i]=(char*)malloc((strlen(help)+1)*sizeof(char)); 
       strcpy(*t[i],help); 
     } 
    } 

Я не забыл позвонить второй в main например: fill(&t,n);

Проблема в том, что я получаю сообщение об ошибке после прочтения первой строки и завершения программы.

+3

Это не будет работать 'char * help =" ";' – this

+0

Чтобы развернуть это: когда вы вызываете 'scanf («% s », help)' then' help' должен указывать на ячейку памяти достаточно большой для хранения строки, которая читается. –

+1

Вам не нужно отображать результаты 'malloc' в C. – dasblinkenlight

ответ

0

Проблема в том, что вы не выделяете память для справки.

Изменение char* help=" "; в char help[512]="";

помочь, таким образом указывает на строку буквального (постоянной хранится в блоке памяти, что не разрешено изменять.

+0

Это сработало: D Большое спасибо –

+1

@ user3104033: Имейте в виду, что ввод более 511 символов заставит программу сбой снова неудачно, так как выделенная память будет перезаписана, и возникнет неопределенное поведение, – alk

0

fill() должен только принять char * *, я думаю, вы получаете проблему с приоритетом оператора.

Поскольку вам не нужно перераспределять массив внутри fill(), нет смысла иметь три уровня косвенности. Вы должны изменить его на два, и, конечно, звонить без &.

+0

Как вы сказали мне, я взял char **, и я изменил char * help = ""; to char aide [] = ""; Теперь программы запрашивают у меня все строки, но проблема теперь возникает после написания последней строки с этой ошибкой: «Обложка вокруг переменной« помощник »была повреждена» –

+0

Если 't' объявлен' char ** t' и он передает адрес этой переменной как «fill (& t, n)», тогда объявление 'char *** t' было совершенно правильным. Я согласен с тем, что, возможно, нет необходимости в дополнительном уровне косвенности в коде, который был отправлен здесь, и если 't' не перераспределяется, тогда имеет смысл удалить ненужные уровни перенаправления. –

2

Эта линия

char* help=" "; 

просто определяет указатель, указывающий на " ".

Память не выделена затем сохраните данные для сканирования через scanf().

Если у вас есть максимум символа для сканирования в сделать это следующим образом:

#define SCAN_MAXIMUM (255) 
#define SCAN_FMT_STRINGIFY(max) "%"#max"s" 
#define SCAN_FMT(max) SCAN_FMT_STRINGIFY(max) 

... 

    char help[SCAN_MAXIMUM + 1]; /* Add one for the road^H^H^H^H`0`-terminator. */ 
    scanf(SCAN_FMT(SCAN_MAXIMUM), help); 

Кроме того, эти линии не то, что вы хотите:

*t[i]=(char*)malloc((strlen(help)+1)*sizeof(char)); 
    strcpy(*t[i],help); 

The [] операторских привязок более плотный, чем оператор *, поэтому линии должны выглядеть как

(*t)[i] = malloc((strlen(help) + 1)); 
    strcpy((*t)[i], help); 

Также^2: Там нет необходимости в C, чтобы привести результаты из malloc/calloc/realloc, и не является recommnended.


Также^3: sizeof(char) определяется равным 1.

Смежные вопросы