Проблема при копировании большого массива в маленький - PullRequest
0 голосов
/ 08 января 2020

У меня небольшие проблемы с управлением массивами, возможно, это проблема, связанная с функцией 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;

Ошибка сегментации возникает на первых итерациях.

...