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

时间:2013-02-26 21:36:11

标签: c memory shared multidimensional-array

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

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

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

客户代码:

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]);              
}

我收到“分段错误”错误。

感谢。

1 个答案:

答案 0 :(得分:5)

即使您的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