gpt4 book ai didi

C - 二维动态数组(双指针) - 共享内存

转载 作者:太空狗 更新时间:2023-10-29 17:23:48 25 4
gpt4 key购买 nike

我有 2 个进程(客户端和服务器)通过共享内存进行通信。

我需要创建一个动态的二维数组(基于参数)。该数组存储在一个结构中,然后写入共享段。

我可以将数组写入共享内存,但无法从其他进程检索它。

客户端代码:

struct shared_use_st {
int written_by_you;
int **PID_PRI_array;
};
/* Prepare Dynamic 2D array */
data_store = malloc(/*ROWS*/ 5 * sizeof(int*));
for(i=0;i<5; i++)
data_store[i] = malloc(/*COLS*/ 2 * sizeof(int));


/* Prepare Dynamic 2D array - Shared Memory Seg */
shared_stuff->PID_PRI_array = malloc(/*ROWS*/ 5 * sizeof(int*));
for(i=0;i<5; i++)
shared_stuff->PID_PRI_array[i] = malloc(/*COLS*/ 2 * sizeof(int));


/* Write PID and PRI to data_store array */
data_store[0][0] = pid;
data_store[0][1] = 1;

data_store[1][0] = 12345;
data_store[1][1] = 2;

data_store[2][0] = 12346;
data_store[2][1] = 3;

data_store[3][0] = 12347;
data_store[3][1] = 4;

data_store[4][0] = 12348;
data_store[4][1] = 5;

for(i=0;i<5;i++){
for(x=0;x<=1;x++){
shared_stuff->PID_PRI_array[i][x] = data_store[i][x];
}
}

服务器代码:

    for(i=0;i<5;i++){
printf("PID: %d, PRI:%d\n", shared_stuff->PID_PRI_array[i][0], shared_stuff->PID_PRI_array[i][1]);
}

我收到“段错误”错误。

谢谢。

最佳答案

即使您的 shared_stuff 对象在共享内存中,您也不会将数组写入共享内存。您正在使用 malloc 分配空间,将数据写入该空间,然后将指向该空间的指针放入 shared_stuffmalloc 在当前进程的正常地址空间中分配空间,而不是在您创建的共享内存段中。您需要将数组内容写入共享内存。

假设共享内存段中有足够的空间用于数组,您将必须自己管理地址,而不是使用 malloc。 (如果没有足够的空间,则必须将共享内存段变大,或者随着时间的推移分段传送信息。)

您可以按如下方式在共享内存段中放置一个可变长度数组。

首先,定义一个包含您需要的所有“管理”信息的结构,例如数组大小:

struct StuffStruct
{
size_t NumberOfRows, NumberOfColumns;
… Other information as desired.
};

创建一个指向该结构的指针并将其设置为指向共享内存段:

struct StuffStruct *Stuff = shm;    // shm contains the address from shmat, performed previously.

创建一个指向具有所需列数的数组的指针,并将其设置为指向初始结构之后的共享内存段:

int (*data_store)[NumberOfColumns] = (int (*)[NumberOfColumns]) ((char *) Stuff + sizeof *Stuff);

(C 纯粹主义者请注意:是的,C 标准不保证当您像这样进行指针运算时会发生什么。但是,任何提供共享内存支持的实现都必须支持这种指针运算。)

请注意,sizeof *Stuff + NumberOfRows * NumberOfColumns * size(int) 必须 不大于共享内存段的大小。否则您将在下一步中超出共享内存段。

下一步,用数据填充数组:为 data_store 的元素赋值,就像普通的二维数组一样。

在服务器中,以同样的方式设置Stuff。然后,在客户端写入共享内存段后,从 Stuff 中读取行数和列数。然后以同样的方式设置data_store。然后从 data_store 中读取。

关于C - 二维动态数组(双指针) - 共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15099778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com