2017-04-20 58 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

真的很好解釋謝謝! –