在不同类型的变量之间分配共享内存时出现分段错误

时间:2019-04-11 00:11:37

标签: c arrays shared-memory sizeof

我正在尝试在进程之间共享内存,以“有效地”计算来自具有随机数字符串的文件的字符串重复。因此,假设我用 char **单词了所有这些字符,并且我想共享两个不同类型的变量( WordStruct共享 int shared_length ),第一个引用的结构具有字符串在 words 中的位置,并且该字符串出现,而第二个引用的结构是不同的字符串数量。这是因为我想迭代 shared 并知道何时停止,但是,当我尝试将 shared_length 设置为一个值时,就会出现问题。

这是我的代码:

typedef struct wordSturct {
    int word_id;
    int count;
} WordStruct;

/* open file */
int index = 0;
char* word = malloc(sizeof(char) * 257);
char** words = malloc(sizeof(char*) * buffer)  /* lets say buffer is way to big */
while (fscanf(fp, "%s", word) == 1) {  /* fp is a FILE* */
    words[index] = malloc(sizeof(char) * 257);
    strcpy(words[index], word);
    index++;
}

key_t key = ftok("/tmp", 'F');
int identifier = shmget(key, sizeof(WordStruct) * index + sizeof(int), IPC_CREAT | SHM_W | SHM_R);
void* shared_memory = shmat(identifier, NULL, 0);
WordStruct* shared = (WordStruct *) shared_memory;
int* shared_length = (int *) (shared + sizeof(WordStruct) * index);

从现在开始,我将放置一些测试代码以确保共享内存段的正确功能,因此让我们以为没有重复的单词,因此迭代 shared 直到 index 是正确的:

for (int i=0; i < index; i++) {
    shared[i].word_id = i;
    shared[i].count = 0;
}

直到这里,一切都被接受并正确实例化,但是我尝试这样做:

*shared_length = 0;  /* main.c:125 */

根据VALGRIND,出现以下错误:

  

大小为4的无效写入

     
    

at 0x400F11:main(main.c:125)
    地址0x40d1400未堆叠,未分配或(最近)未释放

  
     

以信号11(SIGSEGV)的默认操作终止的过程

     
    

访问不在地址0x40D1400的映射区域内
    在0x400F11:main(main.c:125)
    ...

  
     

分段错误(核心已转储)

我试图设置一个WrapperStruct来分配shmat()函数,这样我就只能拥有一种结构,但是我甚至需要在打开文件之前就知道 index 值。有我的一堆单词,所以我认为这不是一个选择。

1 个答案:

答案 0 :(得分:2)

对指针进行算术运算时,将以指针指向的对象的大小为单位进行计算。因此,您不需要乘以sizeof(WordStruct) -导致它被乘以两次,而您将不在共享内存之外。应该是:

int* shared_length = (int *) (shared + index);

int *shared_length = (int *)&shared[index];