Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > выделение памяти под элемент структуры (malloc)


Автор: shtuceron 28.5.2011, 14:04
Добрый день, почему-то не работает конструкция вида

Код

typedef struct MyStruct {
  unsigned char *data;
};

MyStruct myStructInit;

myStructInit.data = (unsigned char *)malloc(sizeof(char)*10);


Однако без typedef все работает прекрасно.

вроде задачка элементарная, однако у меня затруднения.

Спасибо (компилятор GCC 4.2)

Автор: volatile 29.5.2011, 00:17
так вы не дописали до конца тайпдеф.

Код

typedef struct somename {
  unsigned char *data;
} MyStruct;

либо безымянную
Код

typedef struct  {
  unsigned char *data;
} MyStruct;


Автор: borisbn 29.5.2011, 08:53
shtuceron, на каком языке ты пишешь ? На Си или на Си++ ? Дело в том, что в этой части (объявление и описание структур) эти языки довольно сильно отличаются. Если Си - то volatile дал исчерпывающий ответ, если Си++, то лучше описывать структуру без typedef'а вообще.

Автор: sergioK1 29.5.2011, 09:04
Цитата(borisbn @ 29.5.2011,  07:53)
shtuceron, на каком языке ты пишешь ? На Си или на Си++ ? Дело в том, что в этой части (объявление и описание структур) эти языки довольно сильно отличаются. Если Си - то volatile дал исчерпывающий ответ, если Си++, то лучше описывать структуру без typedef'а вообще.

так на С++ и malloc вроде бы не нужен,
у меня ощущение что многие изучают С ,но файл называют cpp, частично используя возможности c++,
но не используют объесты,

Я прав ??

Автор: triclosan 29.5.2011, 09:08
sergioK1, ДА!

Автор: borisbn 29.5.2011, 09:26
Цитата(sergioK1 @  29.5.2011,  09:04 Найти цитируемый пост)
у меня ощущение что многие изучают С ,но файл называют cpp, частично используя возможности c++,но не используют объесты,Я прав ??

ДА!

частенько попадаются вопросы по велосипедному списку, где всё Си-шное (struct List, malloc/free и т.п.), а для вывода используется std::cout smile

Автор: sergioK1 29.5.2011, 15:27
Цитата(borisbn @ 29.5.2011,  08:26)


частенько попадаются вопросы по велосипедному списку, где всё Си-шное (struct List, malloc/free и т.п.), а для вывода используется std::cout smile


у меня контр-вопрос а чем это плохо,? естесно если понимаешь разницу, 
почему для массива надо пользовать new , который все равно мalloc зовет, ? 
или printf внутри класса,  или класс стринг , если он мне в данной задаче не нужен, почему не char* как в С ?

 С++ он же не вместо С он в дополнение, 

Автор: borisbn 29.5.2011, 17:45
Цитата(sergioK1 @  29.5.2011,  15:27 Найти цитируемый пост)
почему для массива надо пользовать new , который все равно мalloc зовет, ?

ессно, если понимаешь разницу, то всё равно, но... и на страруху бывает проруха... по закону подлости один раз из 100 ты напишешь
Код

int * p = (int*) malloc( count );

не умножив на sizeof. тупо забудешь. и хорошо, если упадёт сразу - исправишь. а если через день работы программы
 
Цитата(sergioK1 @  29.5.2011,  15:27 Найти цитируемый пост)
или класс стринг , если он мне в данной задаче не нужен, почему не char* как в С

то же самое. забудешь выделить память под завершающий '\0'...

от невнимательности - усталость, спешка (проект нужен завтра или никогда), куча других забот в голове - никто не застрахован.


Цитата(sergioK1 @  29.5.2011,  15:27 Найти цитируемый пост)
или printf внутри класса

а вот это скорее исключение, подтверждающее правило. сам пользую из-за форматного вывода, который в iostream настолько гемороидальный, что плюю на возможные проблемы типа
Код

float f = -1234.6;
char s[ 7 ];
sprintf( s, ".1f", f );

Автор: volatile 29.5.2011, 18:18
Код

typedef class  {
    int data;
} Myclass;

Походу. Это какой язык С или С++ ?  smile 
На С он не скомпилится, так что это явно не С.
Но и С++ назвать как-то рука не поднимается, хотя компилится спокойно на любом С++. (даже на gcc!!!)

С++ позволяет делать многие вещи. за это его ругают, и за это же хвалят.

(не обращайте внимания, так, мысли вслух...)

Добавлено через 2 минуты и 11 секунд
Цитата(borisbn @  29.5.2011,  17:45 Найти цитируемый пост)
 iostream настолько гемороидальный

 smile 

Автор: sergioK1 29.5.2011, 19:47
Цитата(volatile @ 29.5.2011,  17:18)
Код

typedef class  {
    int data;
} Myclass;

Походу. Это какой язык С или С++ ?  smile 
На С он не скомпилится, так что это явно не С.
Но и С++ назвать как-то рука не поднимается, хотя компилится спокойно на любом С++. (даже на gcc!!!)

С++ позволяет делать многие вещи. за это его ругают, и за это же хвалят.

(не обращайте внимания, так, мысли вслух...)

Добавлено @ 18:21
Цитата(borisbn @  29.5.2011,  17:45 Найти цитируемый пост)
 iostream настолько гемороидальный

 smile

еще лучше пример 

Код


  class NoAccess{
public :
    int getValue(){
        return value;;
    }
private :
    int value;
    NoAccess(){
        value=10;
    }
};


Код

   NoAccess* noacess=(NoAccess*)malloc( sizeof(NoAccess));

    cout<<noacess->getValue()<<endl;


когда учился профессор наш любил на экзаменах всякие штучки типо этой ,
потом приговаривал , это язык для ненормальных  smile  smile 



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)