2013-02-23 60 views
0

....嗨,大家好,我總是在運行我的代碼時出現「分段錯誤」。我知道這個錯誤發生在寫入文件時出現問題(我想共享內存也是如此),我知道錯誤來自於for循環,我嘗試了所有解決這個錯誤的方法,但都失敗了(我甚至刪除了for循環,只輸入* s ='A')。任何幫助請。給共享內存段寫信時出現問題

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <stdlib.h> 

main() 
{ 
    //Shared memory parameters 
    int shmid ; 
    int shmsize = 14; 
    key_t key = 2121; 
    char *shm, *s; 
    //Create SMS 
    if ((shmid = shmget (key , shmsize, 0666 | IPC_CREAT)) == -1) { 
     perror ("Error in Creating the SMS"); 
     abort(); 
    } 
    //Attatching the sms to the address space 
    if (shm = shmat(shmid , NULL , 0) == (char *)-1) { /*<<<< 23 */ 
     perror ("Error in attatching the SMS"); 
     abort(); 
    } 
    int i ; 
    s = shm; 
    for(i = 0 ; i <= 63 ; i++) 
     *s++ = (char)i; 
     *s = NULL; /*<<<< 33 what's the problem */ 
} 

而且我得到了兩個23和33

回答

1

你應該聽編譯器警告(你應該得到一個預警線7警告,一有main它還有 - 如果你不't,那麼你應該添加-Wall到編譯器開關)。

所以在23行,它說「讓指針從整數,未作類型轉換」 [1]:

if (shm = shmat(shmid , NULL , 0) == (char *)-1) 

這是因爲你的代碼行沒有做什麼,你認爲它應該做的。如果我們把它分成不同的行,那就更清楚了,不是嗎?

shm = shmat(shmid , NULL , 0) == (char *)-1; 
    if (shm) 

因此,SHM成爲從shmat(...) == -1返回值」的結果是希望爲零,則分配sshm,這意味着*s++試圖寫入地址零。 - 這絕對應該給賽格故障。

修復此通過添加括號以使分配第一發生,那麼比較(如以上shmid = shmget幾行) - 或分裂它像這樣(我的優選方案):

shm = shmat(shmid , NULL , 0); 
    if (shm == (char *)-1) 

這條線:

    *s = NULL; //what's the problem 

是錯誤的,因爲你要轉讓NULL(這是(void *)0,因而指針)到char值。通過這兩種線的糾正這一點,

*s = '\0'; 
*s = 0; 

按下面的評論:你也應該照顧到您的大小共享內存覆蓋要存儲的內容。目前您需要14個字節,然後寫入64個字節。這不會失敗,但這只是因爲大小會變爲4096字節 - 不要在操作系統中「謊報」您所要求的內容 - 甚至是「如果你有時擺脫它......

[1]它總是有益的,如果你發佈實際的警告信息,這將節省我不必編譯代碼找到警告...

+2

您可以添加到你的回答中:shm的大小是14,循環是63字節...... – Aubin 2013-02-23 16:33:03

+0

非常感謝,下次我會小心的。 – 2013-02-23 17:02:28