共享内存中数组的长度是多少?
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
指向段的大小
我有指针和共享内存。
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