我试图在一块共享内存中写一个字符串矩阵。我经常遇到分段错误错误。为什么我一直收到分段错误错误?
/* Includes */
#include <unistd.h> /* Symbolic Constants */
#include <sys/types.h> /* Primitive System Data Types */
#include <errno.h> /* Errors */
#include <stdio.h> /* Input/Output */
#include <stdlib.h> /* General Utilities */
#include <pthread.h> /* POSIX Threads */
#include <string.h> /* String handling */
#include <semaphore.h> /* Semaphore */
#include <wait.h>
#include <sys/stat.h>
#include <fcntl.h> // Para as variáveis O_CREAT, O_EXCL etc
#include <sys/mman.h>
#include <time.h>
#define str_len 10
typedef struct{
char **posix;
} line;
int main(void){
int fd;
line *m;
int data_size = sizeof(line)*4;
//char m[4][3][str_len];
//int i,j;
if ((fd = shm_open("/shm_ex13s", O_CREAT|O_RDWR,S_IRUSR|S_IWUSR)) < 0) { // Abrir o objeto da memória partilhada
fprintf(stderr, "ERROR: No shm_open()\n");
exit(EXIT_FAILURE);
}
ftruncate(fd, data_size); // Ajustar o tamanho da memória partilhada
m = (line *) mmap(NULL, data_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); // Mapear a memória partilhada
m->posix[0] = "ASDAS";
//printf("%s\n", m[0][0]);
// Desfaz mapeamento
munmap(m, data_size);
// Fecha o descritor devolvido pelo shm_open
close(fd);
// O Leitor apaga a memória Partilhada do Sistema
shm_unlink("/shm_ex13s");
exit(EXIT_SUCCESS);
exit(EXIT_SUCCESS);
}
答案 0 :(得分:0)
您无法在进程之间共享指针。每个进程都有自己的虚拟内存。地址无法共享。
进一步指导
mmap(NULL, data_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
您正在创建一个4 line
变量的共享内存,其中指针的指针未初始化。
访问它并使用
进行分配m->posix[0] = "ASDAS";
它是Undefined Behavior:您指定的posix[0]
未被初始化。
最后你无法做你想做的事。 你可以做的是创建一个共享内存并将你的文字字符串复制到它中,你不能引用它们,因为你不能在进程之间共享指针。
例如,你可以:
char *string = "ASDAS";
char *m = (line *) mmap(NULL, strlen(string)+1, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
strcpy(m, string, strlen(string));