在共享内存中创建二维数组
Posted
技术标签:
【中文标题】在共享内存中创建二维数组【英文标题】:Creating a 2D array in the shared memory 【发布时间】:2017-05-03 15:21:23 【问题描述】:我想创建一个程序来将数据存储在二维数组中。这个二维数组应该在共享内存中创建。
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
key_t key;
int shmBuf1id;
int *buf1Ptr;
main(int argc, int *argv[])
createBuf1();
createBuf1()
key = ftok(".",'b');
shmBuf1id = shmget(key,sizeof(int[9][9]),IPC_CREAT|0666);
if(shmBuf1id == -1 )
perror("shmget");
exit(1);
else
printf("Creating new Sahred memory sement\n");
buf1Ptr[3] = shmat(shmBuf1id,0,0);
if(buf1Ptr == -1 )
perror("shmat");
exit(1);
但是当我运行这个程序时,它给出了一个分段错误(核心转储)错误。我是否在共享内存中正确创建了二维数组?
【问题讨论】:
在分配给buf1Ptr[3]
之前,您从未初始化过buf1Ptr
。
没有二维数组,也没有指向一个的指针(或一维数组,这是同义的方式)。 int *
是指向 int
的指针。
【参考方案1】:
首先,int *buf1Ptr
是一个指向 int 的指针。在您的情况下,您需要一个指向二维整数数组的指针,因此您应该将其声明为:
int (*buf1Ptr)[9];
那你需要自己初始化指针:
buf1Ptr = shmat(shmBuf1id,0,0);
现在您可以通过 buf1Ptr(即buf1Ptr[0][0] = 1
)访问您的阵列。这是您程序的完整工作版本:
#include <stdlib.h>
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
key_t key;
int shmBuf1id;
int (*buf1Ptr)[9];
void
createBuf1()
key = ftok(".",'b');
shmBuf1id = shmget(key,sizeof(int[9][9]),IPC_CREAT|0666);
if(shmBuf1id == -1 )
perror("shmget");
exit(1);
else
printf("Creating new Sahred memory sement\n");
buf1Ptr = shmat(shmBuf1id,0,0);
if(buf1Ptr == (void*) -1 )
perror("shmat");
exit(1);
int
main(int argc, int *argv[])
createBuf1();
return 0;
【讨论】:
你能告诉我你为什么使用 int (*buf1Ptr)[9] 来初始化二维数组吗?不应该是 int (*buf1Ptr)[9][9] 吗? (因为它是 2d) 它允许你使用像 buf1Ptr[0][0] 这样的代码而不是 (*buf1Ptr)[0][0] 来访问单元格。它之所以有效,是因为数组和指针在 C 中或多或少是相同的东西,所以指针本身就是第一个维度。【参考方案2】:你忘了分配内存:
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
key_t key;
int shmBuf1id;
int *buf1Ptr;
int main(int argc, char *argv[])
createBuf1();
createBuf1()
key = ftok(".",'b');
shmBuf1id = shmget(key,sizeof(int[9][9]),IPC_CREAT|0666);
if(shmBuf1id == -1 )
perror("shmget");
exit(1);
else
printf("Creating new Sahred memory sement\n");
int buf1Ptr[4];
buf1Ptr[3] = shmat(shmBuf1id,0,0);
if(buf1Ptr == -1 )
perror("shmat");
exit(1);
【讨论】:
您能进一步解释一下吗?你为什么使用 int buf1Ptr[2]? 这是一个错误,我想使用 [4] 我使用 buf1Ptr[4] 因为你想使用内存中的第四个位置。所以它需要是一个大于等于4个位置的数组以上是关于在共享内存中创建二维数组的主要内容,如果未能解决你的问题,请参考以下文章