2017-02-07 3 views
0

моя проблема сегодня в том, что мне нужно выделить динамический массив структур. Я закодировал всю свою программу, но я получаю seg-ошибки, и я считаю, что это потому, что я не правильно распределял вещи. В целом мне хотелось бы получить дополнительную информацию о том, как это сделать, и где я ошибся. Благодаря!Выделение динамического массива структур в C

Вот моя структура:

struct names { 
    char *Name1; 
    char *Name2; 
}; 
struct names **namePointer = NULL; 

Вот где я хочу выделить для ряда структур в массиве, где numOfElems является переменной, которая будет подсчитывать, сколько итераций мне нужно. В настоящее время он установлен в 1, и будет расти один каждый раз, когда мне нужно больше места:

numOfElems = 1; 
*namePointer = realloc(*namePointer, sizeof(struct names) * numOfElems); 

Вот как я хочу, чтобы получить ввод, а затем сохранить значения для структур в массиве. Строка была выделена ранее, а затем перераспределяется на количество символов, как это было спецификация:

printf("Enter Name1: "); 
fgets(namePointer[i]->Name1, 50, stdin); 
stringLen = strlen(namePointer[i]->Name1) + 1; 
namePointer[i]->Name1 = realloc(namePointer[i]->Name1, sizeof(char) * stringLen); 

В конце цикла есть «я ++», а затем он снова проходит через весь процесс, чтобы надеюсь, отправьте следующие значения в следующее пятно в массиве struct. Я получаю ошибку seg и не знаю, почему. Если есть более простой способ динамического выделения массива структур, пожалуйста, поделитесь!

Еще раз спасибо.

+1

Не говорите нам, что вы думаете о коде, покажите его нам. Нам нужно увидеть ваше выделение строк и вашего цикла. Кроме того, где происходит сегрегация? Запуск этого только один раз в отладчике должен указывать на правонарушение строки кода. –

+1

Почему вам нужен тип 'struct names **'? – yano

+0

Ваша переменная 'namePointer' должна быть типа' struct names * namePointer; 'с одной звездой, а не с двумя. Если у вас есть массив 'int', вы используете' int * ptrIntArray; '- аналогично массиву' struct names'. Как написано, вы выделили больше памяти, чем необходимо в массиве указателей на структуры, но вы не выделили ничего для указателей. –

ответ

1

Вам нужно пространство для хранения ввода:

printf("Enter Name1: "); 
fgets(namePointer[i]->Name1, 50, stdin); /* Name1 is an uninitialized pointer */ 
stringLen = strlen(namePointer[i]->Name1) + 1; 
namePointer[i]->Name1 = realloc(namePointer[i]->Name1, sizeof(char) * stringLen); 

использовать промежуточный массив и strcpy:

char temp[50]; 
printf("Enter Name1: "); 
fgets(temp, sizeof temp, stdin); 
stringLen = strlen(temp) + 1; 
namePointer[i]->Name1 = realloc(namePointer[i]->Name1, sizeof(char) * stringLen); 
strcpy(namePointer[i]->Name1, temp); 

Или использовать strdup (не стандарт, но доступны на многих реализациях):

char temp[50]; 
printf("Enter Name1: "); 
fgets(temp, sizeof temp, stdin); 
namePointer[i]->Name1 = strdup(temp); 
+0

или 'namePointer [i] -> Name1 = strdup (temp);' вместо последних 3 строк – pm100