2015-08-05 1 views
-2

Я хочу иметь массив указателей на строки и просто получить пространство, необходимое для каждой строки. Я знаю malloc и getc требуются, но не знакомы с их использованием.Как создать динамический массив строк с пространством, просто необходимым для каждой строки в C

Это часть моего кода. Он выдает сообщение об ошибке "неисправность Сегментация" ....

char **allstrs; 
char *one_str; 
int totstrs=0,current_size= INITIALSIZE; 

allstrs = (char **)malloc(current_size*sizeof(char*)); //dynamic array of strings 
while(getstr(one_str)!=EOF){ 
    if(totstrs == current_size){ 
     current_size *=2; 
     allstrs = realloc(allstrs, current_size*sizeof(char*)); 
    } 
    strcpy(allstrs[totstrs],one_str); 
    printf("String[%d] is : %s\n",totstrs,allstrs[totstrs]); 
    totstrs ++; 

} 
free(allstrs); //deallocate the segment of memory 

return 0; 

и функцию getstr под названием

char c; 
int totchars=0, current_size=INITIALCHARS; 

str = (char*)malloc(sizeof(char)); 
while(c!='\n'){ 
    c = getc(stdin);  
    if(c==EOF){ 
     return EOF; 
    } 

    if(totchars == current_size){ 
     current_size *=2; 
      str = (char*)realloc(str,current_size*sizeof(char)); 
    } 
     str[totchars] = c; //store the newly-read character  
    totchars++; 
} 
str[totchars]='\0'; //at the end append null character to mark end of string 

return 0; 

}

+2

'getstr (символ *)' 'изменение getstr (символ **)' и 'STRCPY (allstrs [totstrs], one_str)' в 'allstrs [totstrs] = one_str; ',' char c; 'to' int c; ',' totchars == current_size' to 'totchars == current_size-1' в' getstr' – BLUEPIXY

+2

Стандартное предупреждение: не бросать 'void *', как было возвращено 'malloc' & friends! C не является C++. – Olaf

+1

Как вы сказали, у вас есть два вопроса.Один для malloc и один для getc. Вы должны изучать их обоих и задавать вопросы по их использованию. Поскольку ваш вопрос стоит, это почти так, как будто вы просите нас переписать свой код для вас. – Rob

ответ

2

Вы не выделяя какой-либо памяти для Целевая строка здесь:

strcpy(allstrs[totstrs],one_str); 

На данный момент allstrs[totstrs] является просто диким указателем.

выделить память для строки назначения первой:

allstrs[totstrs] = malloc(strlen(one_str) + 1); 
strcpy(allstrs[totstrs],one_str); 

И не забудьте free все эти строки позже, когда вы сделали, конечно (до free(allstrs)).

(В качестве альтернативы возьмите совет @ BLUEPIXY и просто назначьте указатель, выделенный в getstr, вместо strcpy - это, вероятно, лучшее решение, в зависимости от того, что еще вы пытаетесь сделать).


Заметим также, что у вас есть несколько ошибок в вашей getstr функции:

(1)

char c; 

должен быть инициализирован, например:

char c = '\0'; 

(или какой-то другой подходящий символ).

(2)

str = (char*)malloc(sizeof(char)); 

должен быть:

str = malloc(current_size); 

(3) Похоже, вы не выделяя аддитивный полукокс, необходимый для хранения завершающего '\0'.


Общее примечание: never cast the result of malloc in C.