我已经尝试了好几个小时,并且用谷歌搜索了所有我想到的东西,但是我快要疯了。
我有一个结构:
typedef struct { int rows; int collumns; int* mat; char* IDs_row; } mem;
直到以后,我才知道int (矩阵)和char 的大小。
完成后,我将创建共享内存,如下所示:
mem *ctrl; int size = (2 + ((i-1)*num_cons))*sizeof(int) + i*26*sizeof(char); //I have the real size now shmemid = shmget(KEY, size, IPC_CREAT | 0666); if (shmemid < 0) { perror("Ha fallado la creacion de la memoria compartida."); exit(1); } ctrl = (mem *)shmat(shmemid, 0, 0); if (ctrl <= (mem *)(0)) { perror("Ha fallado el acceso a memoria compartida"); exit(2); }
没问题 然后,我给ctrl-> rows和collumns赋一个值,并将0赋给所有矩阵。
但是之后,我在char *和bam中写了一些段错误。
调试程序时,我看到mat和IDs_row这两个指针都为null。如何在共享内存段内为它们提供正确的值?
我试图删除char *指针,只是想尝试一下,然后在连接到所述共享内存的另一个程序中出现了段错误错误,并且只是检查了矩阵内的值(检查->行和-> collumns是否为成功)
ctrl = (mem *)shmat(shmemid, 0, 0);
这仅将有效内存分配给ctrl指针,而不分配给ctrl->mat或ctrl->IDs_row。
ctrl
ctrl->mat
ctrl->IDs_row
您可能想要:
mem *ctrl; shmemid = shmget(KEY, sizeof(ctrl), IPC_CREAT | 0666); //allocate memory for the structure ctrl = (mem *)shmat(shmemid, 0, 0); //allocate memory for the int* shmemid = shmget(KEY,((i-1)*num_cons))*sizeof(int), IPC_CREAT | 0666); ctrl->mat = (int*)shmat(shmemid, 0, 0); //allocate memory for the char* shmemid = shmget(KEY,i*26*sizeof(char), IPC_CREAT | 0666); ctrl->IDs_row = (char*)shmat(shmemid,0,0);