структуры и Цэ (структура в структуре)

Модератор: Модераторы разделов

khart
Сообщения: 26
ОС: Gentoo

структуры и Цэ

Сообщение khart »

у меня возникла такая проблема... вообщем нужно в структуре описать указатель на другую структуру... но что-то у меня не получается... в чем проблема? подскажите. plzzz

#include <stdio.h>

struct s1 {
int i;
};

struct s2 {
int ii;
struct s1 *s;
};

int main(void) {
struct s2 *a;

a->s->i = 1;
return 0;
}
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: структуры и Цэ

Сообщение elide »

в чем проблема? подскажите. plzzz
проблема в том, что ты не понимаешь что такое указатель, как он работает и для чего нужен.
медитируй над

Код: Выделить всё

int main(void) {
struct s1 b1, *b = &b1;
struct s2 a1, *a = &a1;
a->s = b;

a->s->i = 1;
return 0;
}
пока не наступит просветление.
слава роботам!
Спасибо сказали:
Аватара пользователя
lava
Сообщения: 155
ОС: archer

Re: структуры и Цэ

Сообщение lava »

А как конкретно у тебя не получается?
По-моему прога при выполнении этого кода должна вылетать.
Это происходит из-за отсутствия самих объектов: ты просто объявил уазатели на них.

Как вариант (наверно, лучший, но не всегда самый удобный) - ответ elide: создаются объекты и заодно указатели на них.
Можно немного иначе:

Код: Выделить всё

int main( void ) {
struct s2 *a;
a = new struct s2;
a->s = new struct s1;
a->s->i = 1;
// Взял память - не забудь положить на место
delete a->s;
delete a;

return 0;
}
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: структуры и Цэ

Сообщение elide »

lava
ну тут речь про Цэ (:
так что никаких new/delete. только malloc/free и приведение типов.
учитывая, что человек не понимает сути указателей, не думаю, что этот вариант - проще.
слава роботам!
Спасибо сказали:
Andrew S
Сообщения: 225
Статус: экспериментатор
ОС: Conrad-Gentoo

Re: структуры и Цэ

Сообщение Andrew S »

int main(void) {
struct s2 *a;

/*Выделяем память*/
a->s=(struct s1 *)malloc(sizeof(struct s1));
/*Проверяем выделилась ли она*/
if(a->s == NULL) {
printf("Not enough memory\n");
exit(1)
}
a->s->i = 1;
/*И не забываем освободить память*/
free(a->s);
return 0;
}

А вообще переход с паскаля (или бейсика) на Си - это не так просто, потому что паскаль создает иллюзию понимания там, где его (понимания) нет. Это как переход с винды на Линукс, тут книги надо читать.
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: структуры и Цэ

Сообщение elide »

Andrew S
дело говоришь. книжки надо читать, а не на форумы писать. (:

Код: Выделить всё

int main(void) {
struct s2 *a;

/*Выделяем память*/
a->s=(struct s1 *)malloc(sizeof(struct s1));
задумайся, куда указывает a в этом коде (:
слава роботам!
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: структуры и Цэ

Сообщение flook »

Ну прям заклевали :)
Это еще что! Мне одному студенту надо было передать в функцию указатель на указатель на char, а потом значение указателя проверить (strtol) так он вместо

Код: Выделить всё

char *end;
strtol(str, &end, 10);

вот так вот налобал

Код: Выделить всё

char **end;
end = (char **)malloc(sizeof(char *));
strtol(str, end, 10);


а вы говорите... :rolleyes:
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Andrew S
Сообщения: 225
Статус: экспериментатор
ОС: Conrad-Gentoo

Re: структуры и Цэ

Сообщение Andrew S »

elide писал(а):
06.04.2006 10:03
Andrew S
дело говоришь. книжки надо читать, а не на форумы писать. (:

Код: Выделить всё

int main(void) {
struct s2 *a;

/*Выделяем память*/
a->s=(struct s1 *)malloc(sizeof(struct s1));
задумайся, куда указывает a в этом коде (:


Ага, правильно, высыпаться тоже надо... Вот так и появляются глючные программы :)
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: структуры и Цэ

Сообщение elide »

самый прикол не в этом (:
я один раз как-то вот так же ошибся, в результате чего обнаружил, что если в самом начале программы сделать *((int*)0x40015cc0)=6; то можно получить кучу debug вывода откуда-то из недр системы (: смотрелось все это крайне забавно (:
слава роботам!
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: структуры и Цэ

Сообщение Liksys »

elide писал(а):
07.04.2006 17:15
самый прикол не в этом (:
я один раз как-то вот так же ошибся, в результате чего обнаружил, что если в самом начале программы сделать *((int*)0x40015cc0)=6; то можно получить кучу debug вывода откуда-то из недр системы (: смотрелось все это крайне забавно (:

Круто. А как оно работет?
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: структуры и Цэ

Сообщение elide »

хтож его знает... надо курить сырцы glibc.
слава роботам!
Спасибо сказали: