2013-04-25 2 views
0

Привет У меня есть эта структурадинамически выделять память для указателя на массив структуры

typedef struct STUDENT 
{ 
    char studName[20]; 
    int timeEnter; 
    int timeUpdate; 
}STUDENT; 

и локальный указатель на массив структуры

STUDENT *studArr[100]; 

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

fscanf(fp, "%s", &first); 
**studArr = (STUDENT**) malloc(sizeof(STUDENT*)*first); 

Я получил сообщение об ошибке сказав, что ни один оператор «=» не соответствует этим операндам по линии выделения

почему я gettting ошибки, что я сделал не так?

спасибо заранее

+0

почему '** studArr' и почему' SizeOf (СТУДЕНТ *) '? –

+0

, потому что я хочу выделить указатель на структуру, чтобы я мог указать члену структуры позже на – bluebk

+0

не набрасывать malloc() возвращаемый тип ... – akp

ответ

3

Я думаю, ты путаешь вещи, это выглядит, как вы объявить массив указателей, когда все, что вы требуется один указатель. Обратите внимание, что пока вы индексируете правильно, указатель на «один» struct такой же, как указатель на сотню.

Вы, вероятно, следует иметь:

STUDENT *studArr; 

тогда, когда вы знаете, сколько вам нужно (я предполагаю, что это first число студентов, выделить место для):

studArr = malloc(first * sizeof *studArr); 

Рекомендуем также обратите внимание, что no casting is needed.

+0

по какой-то причине компилятор, который я использую, попросил передать функцию malloc в STUDENT *, возможно, потому, что я использую компилятор C++ – bluebk

1

Если вы хотите, чтобы выделить массив из 100 студентов, у вас есть два варианта:

struct STUDENT 
{ 
    char studName[20]; 
    int timeEnter; 
    int timeUpdate; 
}; 


struct STUDENT studArr1[100]; 

... OR ... 

struct STUDENT *studArr2 = (struct STUDENT *)malloc (sizeof (struct STUDENT) * 100); 

Если вы просто хотите указатель, вы можете сказать:

struct STUDENT *p = studArr1; 

PS:

Я сознательно покинул вещество «typedef», чтобы не путать основная проблема (struct vs. array of struct vs указатель на массив структуры).

+0

как я могу выделить, если у меня есть что-то вроде этого STUDENT * studArr [100] ;? – bluebk

0

Вы определили массив указателей на struct, а не указатель на массив структуры. Память для массива уже выделена как глобальный массив.

Тип **studArr является СТУДЕНТОМ и, следовательно, несовместим с выражением справа от оператора присваивания, которое отлито от (STUDENT**).

вероятно Вы имели в виду:

STUDENT **studArr; 

[...]

fscanf(fp, "%s", &first); 
studArr = (STUDENT**) malloc(sizeof(STUDENT*)*first); 
0

Как вы используете STUDENT * studArr [100]; то это означает, что вы выделили память для 100 указателей для типа структуры STUDENT.

поэтому для выделения памяти вы должны попробовать.

studArr =malloc(sizeof(struct STUDENT)*first); 

, то вы можете получить доступ ко всем членам, выделенных в качестве studArr[i] ....so on.

+0

. Спасибо, я нашел еще один вопрос, который имеет ту же проблему http://stackoverflow.com/ вопросы/15397728/c-pointer-to-array-of-point-to-structure-alloc-deallocation-issues – bluebk

+0

@bluebk добро пожаловать в SO !!! – akp

0

Вы не совсем поняли, какова ваша общая цель.

Прежде всего, вы хотите использовать %d если вы хотите читать в целом:

int count; 
if (fscanf(fp, "%d", &count) != 1) { // error... } 

Далее, не используйте STUDENT и как имя структуры и typdef. Просто оставьте имя STRUCT из:

typedef struct 
{ 
    char studName[20]; 
    int timeEnter; 
    int timeUpdate; 
} student_t; 

Теперь вы будете хотеть только указатель на массив student_t с:

student_t* student_array = NULL; 

Наконец, выделить этот массив:

student_array = malloc(count * sizeof(student_t)); 

Теперь вы можете использовать его, например:

strncpy(student_array[0].studName, "Bobby", 20); 

Или получить указатель на каждый студент:

student_t* bob = &student_array[1]; 
bob->timeEnter = 42; 
Смежные вопросы