2016-12-07 3 views
1

Я изо всех сил пытаюсь понять, как выделить память для моей переменной studentContent.как выделить память структурной переменной

struct contactInfo { 
    char Name[101]; 
    char Assignment[101]; 
    char MarkDescription[101]; 
    char feedBack[12][101]; 

}; 
struct contactInfo studentContent 

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

+0

Почему вы выделяете пространство для 2-х структур? И что вы имеете в виду, когда говорите, что размер содержимого будет другим? Как так? –

+0

Извините, может быть, я ошибся. Я хочу выделить пространство для 1 структуры. Содержимое будет отличаться при каждом цикле. Я перебираю файл, потянув за каждую строку, сохраняя каждую строку в своем уважаемом поле внутри структуры. После того, как я заполнил все поля, я пишу в файл эти содержимое в другом порядке. моя петля продолжит чтение файла и сохранит следующий набор данных в структуре, чтобы поля могли отличаться по размеру во второй раз. – bodotheguy

+0

Вы не можете изменить размер элементов в структуре. Они всегда будут размером, который они объявили. Если строки, которые вы читаете в этих массивах, меньше размера массива, все в порядке. Тебе не нужно ничего делать. –

ответ

1

Первые присваивания ptr по адресу локальной переменной studentContent, однако следующая строка перезаписывает это. Он изменяет ptr, чтобы указать на динамически выделенный буфер с пространством для 2 экземпляров struct contactInfo.

Если что вы хотите иметь массив из struct contactInfo, и есть число элементов этого увеличения массива, как у вас есть несколько экземпляров struct contactInfo заселить, вы передаете ptr к realloc с размером n * sizeof *ptr, где n - количество элементов в массиве.

struct contactInfo *tmp_ptr = realloc(ptr, n * sizeof *ptr); 
if (tmp_ptr == NULL) { 
    perror("realloc failed"); 
    exit(1); 
} 
ptr = tmp_ptr; 

Обратите внимание, что вы не должны объявить экземпляр struct contactInfo (studentContent в исходном коде), только указатель на один.

EDIT:

Основываясь на ваш комментарии, так как вы просто нужен один экземпляр для заполнения для того, чтобы читать и писать один патрон данных в то время, вам не нужно использовать динамическое выделение памяти. Просто объявляйте один экземпляр и каждый раз перезаписывайте содержимое.

+0

Я знаю, что мне это не нужно, но если бы одно из моих полей было массивом символов [101], которое заполняется только наполовину. Я хочу, чтобы это поле уменьшилось до нужного размера. Я всего лишь занимаю столько места, сколько мне нужно. Для практики. – bodotheguy

+0

Я еще не там, и это, вероятно, отдельный вопрос, но я хочу сделать все мои указатели полей, чтобы я мог просто указать на один символ [101], если это возможно. – bodotheguy

+0

, если я заполняю его данными до [50] id, как только нужно использовать до [50]. Имеет ли это смысл? – bodotheguy

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