分段错误:尝试在共享内存中编写字符串数组c

时间:2017-04-20 16:33:10

标签: c arrays string memory-management segmentation-fault

我试图实现一个基本程序,它在共享内存中写入一个字符串数组,然后从那里读取它。我经常采取分段错误。我真的不知道出了什么问题(我真的搞砸了)因为我第一次使用共享内存。任何帮助将不胜感激,谢谢!

代码:

#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]值保存在共享内存中。

1 个答案:

答案 0 :(得分:3)

分段错误似乎与使用共享内存无关。 实际上你在这里声明的是(*数组)[100] [50]是指向2D数组的指针。但是在访问它时,您将其视为普通的2D数组变量。 因此,如果你像(* array)[i]那样访问它,那么就没有内存违规。

*数组指向2D数组,而数组只是指向数组的指针的位置。 你可以尝试像(* array)[i]那样填充数组,然后尝试在循环中打印array [i]。第一个元素,即数组[0]将是有效的,因为索引0将只是打印*数组。 但是从索引1开始,它将尝试访问可能不是有效位置的位置*(数组+ 1)。这会导致分段错误。 但是(* array)[i]表示访问有效的位置(* array)+ 1,因为数组是在传染性内存位置分配的