2013-06-15 2 views
0

Я пытаюсь создать массив структур элементов, как показано ниже:ЬурейеЕ требуется в объявлении структуры

#include <stdio.h> 
#include <stdlib.h> 

struct termstr{ 
double coeff; 
double exp; 
}; 

int main(){ 

termstr* lptr = malloc(sizeof(termstr)*5); 

return 0; 
} 

Когда я скомпилировать это, я получаю ошибки следующим образом:

term.c: In function ‘main’: 
term.c:11:1: error: unknown type name ‘termstr’ 
term.c:11:31: error: ‘termstr’ undeclared (first use in this function) 

Однако , когда я изменить свой код к следующему, он компилирует как обычно:

#include <stdio.h> 
#include <stdlib.h> 

typedef struct termstr{ 
double coeff; 
double exp; 
}term; 

int main(){ 

term* lptr = malloc(sizeof(term)*5); 

return 0; 
} 

Я добавил ЬурейиЙ (с именем типа в качестве термина), чан ged имя struct to termstr и распределяет память с термином * как тип указателя.

Требуется ли typedef для такой ситуации, то есть для создания массивов структур? Если нет, то почему первый код дал ошибки? Требуется ли typedef для создания и использования одного экземпляра структуры?

+0

Возможный дубликат [Что такое синтаксически правильный способ объявления C-структуры?] (Http://stackoverflow.com/questions/4698600/whats-the-syntactically-proper-way-to-declare-ac-struct) –

+0

Нет, вам не нужно typedef. Вы также можете обойтись без него, но вам нужно добавить ключевое слово struct: 'struct termstr * lptr = malloc (5 * sizeof * lptr);' – wildplasser

ответ

2

Первый тип не работает, потому что вы забыли struct ключевое слово перед termstr. Ваш тип данных - struct termstr, но не только termstr. Когда вы typedef, результирующее имя используется как псевдоним для struct termstr.

Даже вам не нужно это делать.Использование typedef лучше:

Кстати, не забудьте освободить память:

читать why to use typedef?

Ваш рабочий код должен быть:

#include <stdio.h> 
#include <stdlib.h> 

struct termstr{ 
    double coeff; 
    double exp; 
}; 

int main(){ 

struct termstr* lptr = malloc(sizeof(struct termstr)*5); 
free(lptr); 
return 0; 
} 
1

Оно должно быть:

struct termstr * lptr = malloc(sizeof(struct termstr)*5); 

или даже лучше:

struct termstr * lptr = malloc(sizeof(*lptr)*5); 
1

В C, имя типа данных является "структура termstr", а не просто "termstr".

1

Вы можете сделать что-то вроде этого:

typedef struct termstr{ 
    double coeff; 
    double exp; 
} termstrStruct; 

И тогда вы можете использовать только termstrStruct как имя структуры в:

termstrStruct* lptr = malloc(sizeof(termstrStruct)*5); 

Это не всегда требуется, вы можете просто написать struct termstr.

Не забудьте указать free выделенную память!

+3

Хотя это совершенно верно, я бы подумал, что он обфускации кода именовал разные вещи одна и та же. – alk

+0

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

0

Если вы хотите использовать typemame termstr, то вы можете использовать typedef: typedef struct { double a; double b; } termstr;

0

В C вам нужно добавить STRUCT ключевое слово, а также, так как вы используете ЬурейеЕ связать псевдоним с «структура termstr» или вам нужно написать что-то вроде

struct termstr* lptr = malloc(sizeof(struct termstr)*5); 

В C++ однако вы можете ссылаться на него как на «termstr» напрямую (читайте: ключевое слово struct больше не требуется).

1

Typedef является удобным способом сокращение этого:

struct termstr* lptr = (struct termstr*)malloc(sizeof(struct termstr)*5); 

t o это:

typedef struct termstr* term; 
term* lptr = (term*)malloc(sizeof(term)*5); 

Кастинг malloc также является хорошей идеей!

+2

Кастинг malloc - ужасная идея. ИМО. (Кстати: вам понадобится дополнительная астерикс) – wildplasser

+2

Почему литье 'malloc()' в C не является необходимым и даже более плохая идея: http://stackoverflow.com/a/605858/694576 – alk

+0

Да, мои профессионалы всегда сказал, что отливка лучше. Ну, вы узнаете что-то новое каждый день! – jh314

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