【问题标题】:Segmentation fault: Trying to write array of strings in shared memory c分段错误:试图在共享内存 c 中写入字符串数组
【发布时间】:2017-09-17 10:00:59
【问题描述】:

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

代码:

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

【问题讨论】:

  • 讽刺的是你的名字是段错误。
  • @AjayBrahmakshatriya 我在内存管理方面真的很糟糕! :)
  • 首先检查 shmgetshmat 错误返回值(阅读手册页了解详细信息)。返回值正常吗? (一般来说,在缺乏基本错误检查的代码上调试错误是没有意义的。)
  • @hyde 我已经尝试过了,但是我在 shmget 上遇到了分段错误,所以我无法真正检查它返回的内容..
  • 贴出的代码编译不干净!编译时,始终启用所有警告,然后修复这些警告。 (对于gcc,至少使用:-Wall -Wextra -pedantic 我也使用:-Wconversion -std=gnu11

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


【解决方案1】:

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

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

【讨论】:

  • 欢迎您!更新了关于保存数组 [0] 值的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多