共享内存中数组的长度是多少?

What will be length of array in shared memory?

我有指针和共享内存。

int *data;
shmid = shmget( IPC_PRIVATE, N * sizeof(int), IPC_CREAT | S_IRUSR | S_IWUSR );  
data = (int*)shmat( shmid, 0, 0 );

然后我将数组写入此共享内存。但是当我尝试计算该数组的长度时,我总是得到 8 位(或字节,我不知道)。当我写入数组数字时,我总是得到 8 位。

请帮助我,对不起我的英语! :)

sizeof() 运算符在 C 中被解释为 编译时 。在您的程序中,sizeof 运算符 return 指针的大小取决于您的系统。

您无法在 C 中计算指针给定的某些数组的已用长度(因为数组会衰减为指针)。您需要 明确地在其他地方保留该长度 (例如,在其他一些变量中,或者使用一些 struct 长度和 flexible array member)。

当然需要把使用的长度(用于计算)和分配的大小(分配时需要)分开。

sizeof operator is computed at compile-time (it is constant, except for VLAs)。对于指针,在我的 Linux/x86-64 桌面上它总是 8 个字节(独立于分配的大小,如果有的话)。

如果你想获取共享内存的大小,那么你可以使用 shmctl()

shmtctl(shmid, IPC_STAT, shmid_ds_buf)

存储在与 shmid 关联的内核数据结构中的每个共享内存段的大小。 shmid_ds_buf->shm_segsz

指向段的大小

参考man shmctl