繁体   English   中英

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

[英]Segmentation fault: Trying to write array of strings in shared memory c

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

码:

#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]那样填充数组,然后尝试在循环中打印array [i]。 第一个元素,即数组[0]将是有效的,因为索引0将只是打印*数组。 但是从索引1开始,它将尝试访问可能不是有效位置的位置*(数组+ 1)。 这会导致分段错误。 但是(* array)[i]意味着访问有效的位置(*数组)+ 1,因为数组是在传染性内存位置分配的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM