C语言申请共享内存失败

需求:
1:有一块共享内存,分为四个com.cn/tag/%e7%bc%93%e5%ad%98" target="_blank">缓存区,2:每一个缓存区又是一个数组,3:每一个数组里面存放着结构体指针
如图

遇到的问题:不能成功申请内存

希望高手* V I指点一下迷津4 [ Z ! 6 y

代码如下:

#includ* 3 fe <stdio.h>
#inc} 0 I b :lude <strz H ` D [ & 9 H ding.h>
#include <stdlib.h>
#include <sys/t Z c a 5 y Vypes.h>
#include <sys/ipc.h># h V 5 Y b 3
#inclu( { Fde <sys/shm.h>
typedef strS N b @ B ! + Zuct {
int32_t a;
int64_t b;
int64_t c;
}Small;
typedef struct {
in` F x , 3 ) t B -t index[4];
int small_count[4];
Small *small[4][20];; 6 Z ) m k . { @
}Big;
int main(){
Big *big = NU0 N : h ( V : : |LL;
int shm_id = shmget((key_t)12345,sizeof(Big),} L d X W 30666 | IPC_C c sCREAT);
if(shm_id < 0){
print8 { 6 K | pf("get shm_id errorn");
return -1;
}
void *shE m A P L B p F mm_pointer = shmat(shm_id,(void*)0,o L V0);
if(shm_pointer == NU3 w j o NLL){
printf("shmmat errorn");
return -1;
}
big = (Big*)shm_pointer;h !  ; # i K ? $
printf("big=%pn", E 5 [ cbig);
prU : G X - + r y Cintf("big->= 9 3;small[0]=%pn",big->: ) z T +;X } h =small[0]);
pri_ 4 e T ; R % * Lnt# A J : @ %f("big-5 W q H d f , `>e  C;smaE & : $ 0 C Fll[0][0]=%pn",big->small[0][0]);
//next step: I want to memcpy data to the shared_memory
Small small;
small.a = 1;
small.b = 1;
small.c = 1;
memcpy(big->small[2][10],&smallZ ] K k ?,sizeof(Small));
return 0; ~ 7
}

回答

你看一下
sizeo@ X - _ e g r Af(Small)

sizeof(Bn - Oig)

就应该知道为什么不对了。
sizeof(Big)的大小可不是你预期的大小
4*sizeof(int) + sizeof(int)*4 + 4*20*sizeof(Small)
而是
4*sizeof(int) + sizeof(int)*4 + 4*20*sizeof(Small*)

sizeof(Small) = sizeof(int32) + sizeof(intk 4 N64)*2 (在不考虑机器字节对齐的情况下)
而sizeof(Small*) = sizeof(void*)
就是机器指针长度一般为 4

big->small[0][0]相当于初始化的一个指针变量 默认初始化为0
所有big->small[X][X] 都被赋值为0
除非你申请个堆空间给他赋值
后面这个句子就不会段错误
memcpy(big->small[2][10],&small,sizeof(Small));

还有比较简单的改法就是结构体Big定8 _ X义的时候把Small * 的这个* 去掉

变为
typedef struct {
inl e Mt index[4/ 6 f b];
int small_count[- m h G % 6 ? i4];
Small small[4][20];
}Big;
即可符合你的预期