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;

即可符合你的预期

### 回答1: 在C语言中实现共享内存需要使用操作系统提供的系统调用来创建和访问共享内存。 具体来说,需要使用以下步骤来实现共享内存: 1. 使用shmget()系统调用创建共享内存段。shmget()函数需要传入三个参数:共享内存的key,共享内存大小,以及访问权限。如果共享内存段已经存在,则可以使用shmget()函数获取共享内存段的ID。 2. 使用shmat()系统调用将共享内存段连接到进程的地址空间中。shmat()函数需要传入两个参数:共享内存段的ID和一个地址,如果该地址为空,则系统会自动分配一个地址。 3. 对共享内存段进行读写操作,使用与操作普通内存相同的方法进行访问。 4. 当进程不再需要访问共享内存段时,需要使用shmdt()系统调用将共享内存段与进程断开连接。 5. 当所有进程都断开连接并且不再需要共享内存段时,使用shmctl()系统调用删除共享内存段。 需要注意的是,共享内存的并发控制是非常重要的,需要使用互斥锁或信号量等机制来保证共享内存的正确访问。 ### 回答2: C语言可以使用System V共享内存机制来实现共享内存使用共享内存是一种在进程之间共享数据的方式,可以提高进程间通信的效率。以下是使用C语言实现共享内存的一般步骤: 1. 首先创建共享内存区域。可以使用`shmget`函数来创建共享内存,需要指定共享内存的大小、权限和标识符等参数。 2. 绑定共享内存到当前进程中。可以使用`shmat`函数将共享内存映射到当前进程的地址空间中,通过返回的指针可以访问共享内存区域。 3. 使用共享内存进行数据读写。一旦共享内存区域被映射到进程的地址空间,就可以通过指针对其进行读写操作。当多个进程共享同一块内存时,需要进行同步操作,如使用互斥锁或信号量等机制来避免数据不一致或竞态条件。 4. 分离共享内存。当不再需要使用共享内存时,可以使用`shmdt`函数将共享内存从当前进程中分离,并保留共享内存区域供其他进程使用。 5. 删除共享内存。当所有进程都不再需要使用共享内存时,可以使用`shmctl`函数来删除共享内存区域,释放资源。 需要注意的是,共享内存区域只能用于进程间通信,对于线程间通信来说,并不适用。同时,使用共享内存需要谨慎操作,确保数据的一致性和安全性。 ### 回答3: 在C语言中,可以通过使用共享内存来实现不同进程之间的数据共享。下面是一个简单的示例用法: 首先,需要使用`shmget()`函数来创建一个共享内存段。该函数接受三个参数,分别是一个标识符(可以是一个整数值,通常使用IPC_PRIVATE表示),所需内存的大小(字节数),以及标志位(通常为IPC_CREAT | 0666)。 ```c int shmid = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT | 0666); ``` 接下来,使用`shmat()`函数将共享内存段附加到当前进程的地址空间。该函数接受两个参数,即共享内存段的标识符以及访问内存段的权限(通常为0)。 ```c int* shared_memory = (int*) shmat(shmid, 0, 0); ``` 现在,可以在程序中使用`shared_memory`指针来访问共享内存。 当共享内存使用完毕后,需要使用`shmdt()`函数将其从进程中分离。 ```c shmdt(shared_memory); ``` 最后,如果不再需要该共享内存段,可以使用`shmctl()`函数进行控制。该函数的第一个参数为共享内存段的标识符,第二个参数为控制命令(通常为IPC_RMID),第三个参数为一个`struct shmid_ds*`类型的指针。 ```c shmctl(shmid, IPC_RMID, NULL); ``` 这样,就完成了在C语言使用共享内存进行进程间数据共享的实现。需要注意的是,共享内存使用需要谨慎,因为多个进程访问共享内存时必须协调好数据的读写,防止出现数据不一致或竞争条件等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值