kangjianjiankang 2020-06-29 09:35 采纳率: 0%
浏览 240
已采纳

C语言申请共享内存失败

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

遇到的问题:不能成功申请内存
图片说明

希望高手指点一下迷津

代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
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 error\n");
    return -1;
  }
  void *shm_pointer = shmat(shm_id,(void*)0,0);
  if(shm_pointer == NULL){
    printf("shmmat error\n");
    return -1;
  }
  big = (Big*)shm_pointer;
  printf("big=%p\n",big);
  printf("big->small[0]=%p\n",big->small[0]);
  printf("big->small[0][0]=%p\n",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;
}

  • 写回答

1条回答 默认 最新

  • 飞雪蝶映 2020-06-29 14:30
    关注

    你看一下
    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;
    即可符合你的预期

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度