C:使用2D数组进行shmget

时间:2012-03-20 21:53:07

标签: c linux arrays unix shared-memory

我尝试将shmget与2D数组一起使用。 这是我的代码:

char **array;
key_t key;
int size;
int shm_id;
int i = 0;
void *addr;

key = // here I get the key with ftok()
size = (21 * sizeof(char *)) + (21 * sizeof(char **));
shm_id = // here I get the shmid with shmget()

if (shm_id == -1) // Creation
{
     array = (char **)shmat(shm_id, NULL, SHM_R | SHM_W);
     while (i != 20)
     {
         array[i] = memset(array[i], ' ', 20);
         array[i][20] = '\0';
         i++;
     }
     array[i] = NULL;
     shm_id = // here I get the shmid with the flag IPC_CREAT to create the shared memory
     addr = shmat(shm_id, NULL, SHM_R | SHM_W);
}

但我对“array [i] = memset(array [i],'',20);”

这一行的分段错误

我做错了什么?

1 个答案:

答案 0 :(得分:2)

您应首先检查shmget是否成功。如果共享内存的分配失败,那么你就无法使用共享内存! ;-) 像:

If ( shm_id = shmget(.......) == -1) {
exit(1);
}
else {
/* proceed with your work*/
}

和shmat一样。

shmget返回void *。你不能将它分配给char **并像二维数组一样使用它。事实上,char *可以很容易地在逻辑上作为2D数组处理。