разбирать 2d динамический c int массив в общую память - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь создать программу, которая анализирует 2d динамический массив c для другой программы, используя разделяемую память. Я ищу много, но я немного сбит с толку, потому что я не знаком с этим. Мой код до сих пор:

int main (int argc, char* argv []){
    int rows,columns;
    if( argc < 3 ){
        printf("Need The size of the 2d array\n");
        return 0;
    }
    rows = atoi(argv[1]);
    columns = atoi(argv[2]);

    time_t t;
    srand((unsigned) time(&t));

    key_t key = ftok(".",'a');
    size_t size = sizeof(key_t) + (rows * columns + 2 + rows) * sizeof(int);
    int shmid = shmget(key,size,IPC_CREAT|IPC_EXCL|S_IRWXU);
    int *memory = shmat(shmid, NULL, 0);
    printf("Shared Memory Key: %d\n", key);

    int *argsflag = memory;
    int *resflag= memory + 1;
    int *res  = memory + 2;

    int **array = (int **) memory + (rows*columns);

    for(int i = 0; i < rows ; i++) {
        for(int j = 0; j < columns; j++) {
            array[i][j] = rand() % 100;
        }
    }
    for(int i = 0; i < rows ; i++) {
        for(int j = 0; j < columns; j++) {
            printf("%d ",array[i][j]);
        }
        printf("\n");
    }


    shmctl(shmid,IPC_RMID,NULL);
    shmdt(memory);
    return(0);
}

Я получаю ошибку сегментации (ядро сброшено), и я не знаю почему. Также с помощью поиска я нахожу решение со структурой, но я не понимаю, как я могу это построить.

1 Ответ

2 голосов
/ 04 февраля 2020

Вы не можете иметь точку int** в двумерном массиве. Он может указывать только на первый элемент в одномерном массиве int*.

Кроме того, что такое логика c из memory + (rows*columns)? Вы заканчиваете тем, что устанавливаете указатель на последний элемент массива, а не на первый.

Попробуйте вместо этого:

void* memory = shmat( ... 
...
int (*array)[columns] = memory;
...
array[i][j] = ... ;

Где int (*array)[columns] - указатель массива, который заканчивается указать на первый массив в массиве 2D.

Подробнее см. Правильное размещение многомерных массивов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...