Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-2D动态数组(双指针)-共享内存_C_Memory_Shared_Multidimensional Array - Fatal编程技术网

C-2D动态数组(双指针)-共享内存

C-2D动态数组(双指针)-共享内存,c,memory,shared,multidimensional-array,C,Memory,Shared,Multidimensional Array,我有两个进程(客户端和服务器)通过共享内存进行通信 我需要创建一个动态的二维数组(基于参数)。数组存储在结构中,然后写入共享段 我可以将数组写入共享内存,但无法从其他进程检索它 客户端代码: struct shared_use_st { int written_by_you; int **PID_PRI_array; }; /* Prepare Dynamic 2D array */ data_store = malloc(

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

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

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

客户端代码:

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];
                }
            }
struct共享\u使用\u st{
int由you编写;
int**PID\u PRI\u数组;
};
/*准备动态二维阵列*/
数据存储=malloc(/*行*/5*大小(int*);
对于(i=0;iPID_PRI_数组=malloc(/*ROWS*/5*sizeof(int*));
对于(i=0;iPID_PRI_数组[i]=malloc(/*COLS*/2*sizeof(int));
/*将PID和PRI写入数据存储阵列*/
数据存储[0][0]=pid;
数据存储[0][1]=1;
数据存储[1][0]=12345;
数据存储[1][1]=2;
数据存储[2][0]=12346;
数据存储[2][1]=3;
数据存储[3][0]=12347;
数据存储[3][1]=4;
数据存储[4][0]=12348;
数据存储[4][1]=5;
对于(i=0;iPID_PRI_数组[i][1]);
}
我得到一个“分段错误”错误


谢谢。

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

假定共享内存段中有足够的空间用于阵列,则必须自己管理地址,而不是使用
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\u store
的元素赋值,就像普通二维数组一样


在服务器中,以相同的方式设置
Stuff
。然后,在客户端写入共享内存段后,从
Stuff
读取行数和列数。然后以相同的方式设置
数据存储
。然后从
数据存储
读取两个进程中的共享内存地址是否相同?如果不相同,则点ER不起作用。是的,它们是一样的:)对不起,忘了提到我上面有这个;
shared_stuff=(struct shared_use st*)shm;
其中shm是shmat的结果;
/*将段附加到数据空间*/if((shm=shmat(shmid,NULL,0))=(char*)-1){perror(“shmat”);\u Exit(1)+}printf([]段附加\n“;
我在客户端编写了这段测试代码,它的输出完全符合我的预期;
printf(“test\n\n”);for(I=0;I<5;I++)printf(“PID:%d,PRI:%d\n”,shared\u stuff->PID\u PRI\u array[I][0],shared\u stuff->PID\u PRI array[I][1])
您的评论与我的诊断一致。客户机中的代码打印您所期望的内容,因为数据位于客户机地址空间中的预期位置。但是,数据在服务器地址空间中不可见。只有
shared_stuff
直接指向的结构在共享段中,因为您将
shared\u stuff
设置为指向共享段。该结构中的指针指向共享段之外的位置,即
malloc
分配的位置。因为这些位置在共享段之外,所以它们在服务器进程中不可见。我明白了。如果我这样做;
shared\u stuff->writed\u by\u you=1;
这是服务器进程可见,因为它没有指向结构的地址空间之外,对吗?我该如何着手解决手头的问题?谢谢!谢谢Eric!这个回答帮了大忙!我在帖子中更正了几个语法错误;-)。只是有几件事我还是有点困惑。。。如何设置Stuff结构中NumberOfColumns和NumberOfRows的值?Stuff->NumberOfRows=5似乎工作不正常?您还提到共享内存段的大小必须与您发布的公式相同,但是,由于它是动态的,服务器如何知道它的大小?行数和列数由您决定。你的问题陈述说它们是基于参数的,所以由你来设置和使用它们。共享内存大小必须足够大以处理任何大小的数组,或者必须获得数组维度,然后创建足够大的共享内存段<服务器中的code>shmat将分配所有必要的空间;它从内部系统信息获取共享内存大小,服务器只需要以自然的方式使用数组维度。
int (*data_store)[NumberOfColumns] = (int (*)[NumberOfColumns]) ((char *) Stuff + sizeof *Stuff);