c语言输入整数共享内存,C语言申请共享内存失败

需求:

1:有一块共享内存,分为四个缓存区,2:每一个缓存区又是一个数组,3:每一个数组里面存放着结构体指针

如图

17c79ac163351e59f074f0391103ba46.png

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

b155a296102945b532408b16c5093142.png

希望高手指点一下迷津

代码如下:

#include

#include

#include

#include

#include

#include

typedef struct {

int32_t a;

int64_t b;

int64_t c;

}Small;

typedef struct {

int index[4];

int small_count[4];

Small *small[4][20];

}Big;

int main(){

Big *big = NULL;

int shm_id = shmget((key_t)12345,sizeof(Big),0666 | IPC_CREAT);

if(shm_id < 0){

printf("get shm_id errorn");

return -1;

}

void *shm_pointer = shmat(shm_id,(void*)0,0);

if(shm_pointer == NULL){

printf("shmmat errorn");

return -1;

}

big = (Big*)shm_pointer;

printf("big=%pn",big);

printf("big->small[0]=%pn",big->small[0]);

printf("big->small[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],&small,sizeof(Small));

return 0;

}

回答

你看一下

sizeof(Small)

sizeof(Big)

就应该知道为什么不对了。

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(int64)*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定义的时候把Small * 的这个* 去掉

变为

typedef struct {

int index[4];

int small_count[4];

Small small[4][20];

}Big;

即可符合你的预期

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值