У меня небольшие проблемы с управлением массивами, возможно, это проблема, связанная с функцией mmap()
. Таким образом, я не смог скопировать в массив, когда использовал []
и то же самое, когда использовал *
.
Я не получаю ошибки и предупреждения при компиляции, но я получаю ошибка сегментации на сервере windows когда я запускаю окно клиента.
Я знаю, что у меня, вероятно, много ошибок с IP C, но я пытаюсь двигаться вперед небольшими шагами. Я даю вам несколько фрагментов кода. Я думаю, что это глупая ошибка.
Главный сервер
int fd= shm_open("/msg_data",O_CREAT | O_RDWR,0600);
if(fd==-1)perror("shm_open");
ftruncate(fd,sizeof(struct data_t));
struct data_t *pdata=(struct data_t*)mmap(NULL,sizeof(struct data_t),PROT_EXEC | PROT_READ | PROT_WRITE, MAP_SHARED,fd,0);
if(pdata==NULL) perror("mmap");
pall->pdata_all=pdata;
У меня есть проблема в этом фрагменте
//it is in function where
void* upgrade(void*arg)
{
struct all_t*tmp=(struct all_t*)arg;
/* ... */
int l=y-2;
for(int y=0;y<5;l++,y++)
{
int k=x-2;
for(int x=0;x<5;k++,x++)
{
printf("%c ",tmp->pdata_all->position[y][x]);
tmp->pdata_all->position[y][x]=tmp->map[l][k]; //segmentation fault
}
}
/* ... */
l, а k - индекс большого массива из я копирую Это работает.
char **position
находится в заголовочном файле
struct data_t {
int x;
int y;
//char position[5][5];
char**position;
};
struct all_t
{
struct data_t* pdata_all;
char **map;
sem_t serv;
};
и в основной функции клиента
int fd= shm_open("/msg_data",O_RDWR,0600);
if(fd==-1)
perror("shm_open");
ftruncate(fd,sizeof(struct data_t));
struct data_t *pdata=(struct data_t*)mmap(NULL,sizeof(struct data_t),PROT_EXEC | PROT_READ | PROT_WRITE, MAP_SHARED,fd,0);
if(pdata==NULL)
perror("mmap");
char **tab=(char**)malloc(sizeof(char*)*5);
for(int i=0;i<5;i++)
{
tab[i]=(char*)malloc(sizeof(char)*5);
}
pdata->position=tab;
Ошибка сегментации возникает на первых итерациях.