LINUX.ORG.RU

linux. Как разместить в шаред мемори массив структур?


0

0

Задача:
1) Разместить в шаред мемори структуру. (X)
2) Разместить в шаред мемори массив структур. (Y[5])

Первое нормально сделал.
Второе неполучается

Вот такой код:

Цитата:

#include <stdio.h>
#include <sys/shm.h>

struct _x
{
unsigned char test0;
unsigned char test1;
};

struct _y
{
unsigned char test0;
unsigned char test1;
};

struct _x *x;
int x_size=sizeof(struct _x);

struct _y **y;
int y_size=sizeof(struct _y)*5;

int main()
{
int id_x;
int id_y;

id_x = shmget(0001000, x_size, IPC_CREAT);
if (id_x == -1)
{
printf("Error (id_x)\n");
exit(1);
}

x = (struct _x *) shmat (id_x, NULL, SHM_RND);
if ((int)(x) == -1)
{
printf("Error (x)\n");
exit(1);
}

id_y = shmget(0002000, y_size, IPC_CREAT);
if (id_y == -1)
{
printf("Error (id_y)\n");
exit(1);
}

y = (struct _y **) shmat (id_y, NULL, SHM_RND);
if ((int)(y) == -1)
{
printf("Error (y)\n");
exit(1);
}

printf("____1____\n");
x->test0=100;

printf("____2____\n");
y[3]->test1=200;

printf("____3____\n");
return(0);
}




На экране:
____1____
____1____
segmentation fault

Как я понимаю, я либо неправильно записываю в массив структур, либо неправильно его объявил....
Компилятор ошибок и предупреждений не выдаёт...

Собственно вопрос - где ошибка?
Как правльно объявить в шаред мемори массив структур?
Подробные объяснения в природе косяка очень приветствуются.

anonymous

Ответ на: комментарий от dilmah

А типа нельзя показать что и на что надо поменять?
И объяснить почему зря?
И почему зря - если мне нужен массив, а не просто указатель...
Как ты ещё собираешься объявить массив???

anonymous
()

Шареная память тут не при чем.
Ты неправильно арифметику указателей понимаешь.

Замени 
struct _y **y;
на
struct _y (*y)[5];

Die-Hard ★★★★★
()

поменяй следующие строки и будет счастье :)
1)
struct _y **y;
на
struct _y **y;

2)
y = (struct _y **) shmat (id_y, NULL, SHM_RND);
на
y = (struct _y *) shmat (id_y, NULL, SHM_RND);

3)
y[3]->test1=200;
на
y[3].test1=200;

Dead ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.