分割故障:尝试在共享内存中写入字符串数组c



im试图实现一个基本程序,该程序在共享内存中写入一系列字符串,然后从那里读取它。我不断地遇到细分故障。我真的不能说出了什么问题(我真的把它弄乱了(,因为我第一次使用共享记忆。任何帮助将不胜感激,谢谢!

代码:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[])
{
    int shmid;
    int i = 0;
    key_t key = 123;
    char (*array)[100][50];
    shmid = shmget(key, 100 * 50, IPC_CREAT | 0666);
    array = (char *)shmat(shmid, 0, 0);
    // array = malloc(sizeof(int)*count);
    for (i = 0; i < 10; i++)
    {
        strcpy(array[i], "arrayvalues");
    }
    for (i = 0; i < 10; i++)
    {
        printf("n%s---n", array[i]);
    }
    printf("nWritting to memory succesful[+]n");
    shmid = shmget(key, 1024, IPC_CREAT | 0666);
    array = (char *)shmat(shmid, 0, 0);
    for (i = 0; i < 9; i++)
    {
        printf("n%s---n", array[i]);
    }
    printf("nRead to memory succesful[+]n");
    shmdt((void *)array);
    // shmctl(shmid, IPC_RMID, NULL);
    return 0;
}

编辑:它仅将数组[0]值保存在共享内存中。

看来分割故障与使用共享内存无关。实际上,您在这里声明的内容(*数组([100] [50]是指向2D数组的指针。但是,在访问相同的同时,您将其视为普通的2D数组变量。因此,如果您像(*array([i]访问它,则不会违反内存。

*数组指向2D数组,而数组只是指向数组的指针的位置。您可以尝试像(*array([i]这样的数组填充数组,然后尝试在循环中打印数组[i]。第一个元素即阵列[0]将有效,因为索引0除了打印 *数组,其意义不大。但是从索引1开始,它将尝试访问位置 *(数组 1(,这可能不是有效的位置。这会导致分割故障。但是(*array([i]是指有效的访问位置(*array( 1,因为在传染性内存位置分配了数组

最新更新