C ++: массив и разделяемая память - PullRequest
3 голосов
/ 09 марта 2011

Я пытаюсь создать часть общей памяти, чтобы разделить массив, вот мой пример:

int main(){
    key_t key;
    int shm_id;
    int arr[10];

    key=ftok("~/.bashrc",1);

    shm_id = shmget(key, 10*sizeof(int), 0666 | IPC_CREAT);

    arr = (int*)shmat(shm_id, NULL, 0);

    arr[0]=101;
    printf("%d\n",arr[0]);


}

При компиляции я получаю следующую ошибку:

error: incompatible types in assignment of ‘int*’ to ‘int [10]’

Что не так в моем назначении?

Ответы [ 3 ]

7 голосов
/ 09 марта 2011

Вы должны объявить arr как указатель, а не как массив:

int* arr;

Нельзя назначить указатель на массив, и shmat() возвращает указатель.

2 голосов
/ 09 марта 2011

Удалите эту строку:

int arr[10];

и измените вызов shmat () на:

int* arr = (int*)shmat(shm_id, NULL, 0);

Переменная-указатель может использоваться как массив, поэтому arr[0]=101все еще работает.

(Как прокомментировал @Andrew, лучше объявлять переменные в том месте, где они впервые используются. Это снижает риск использования неинициализированной переменной.)

1 голос
/ 09 марта 2011

Когда вы пишете arr [10], вы выделяете массив элементов в стеке.Неявно это означает, что значение & arr [0] (которое действительно является указателем на первый элемент в arr) не может быть изменено.Если вы хотите скопировать содержимое shmat в массив arr, вам нужно использовать memcpy() или другой подобный метод, чтобы правильно установить содержимое arr.

...