在共享内存中创建二维数组

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个位置的数组

以上是关于在共享内存中创建二维数组的主要内容,如果未能解决你的问题,请参考以下文章

将共享内存与矩阵一起使用

银行冲突CUDA共享内存?

如何将字符串数组附加到共享内存? C

是否可以使用 IPC 分配 2D 数组作为共享内存?

“共享内存模型”与“消息传递模型”

共享内存主/从进程访问单个串口