2017-04-20 57 views
1

即时尝试实现一个基本程序,它将字符串数组写入共享内存然后从中读取它。我一直在分段故障。我真的不知道什么是错的(我真的搞砸了),因为我第一次使用共享内存。任何帮助将不胜感激,谢谢!分割错误:试图在共享内存中写入字符串数组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]的值。

+1

具有讽刺意味的是,您的名字是segfault。 –

+1

@AjayBrahmakshatriya我在内存管理方面真的很糟糕! :) –

+1

首先检查* shmget *和* shmat *返回错误值(详细信息请阅读手册页)。返回值是否正确? (一般来说,在缺少基本错误检查的代码上调试错误是没有意义的。) – hyde

回答

3

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

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

+1

这个技巧!谢谢 –

+0

欢迎!更新了关于保存数组[0]值的答案 –

+0

真的很好解释谢谢! –