2017-06-06 112 views
-3

我在這裏和德語很新,所以請原諒我在這裏的英語不好。 作爲學校練習的一部分,我們應該爲基於UNIX的系統上運行的鍵值存儲實現帶有共享內存的套接字服務器。服務器,共享內存和fork()正在工作。我們使用一個結構數組,我們爲這個(put,get,delete)做了函數。在put方法中,當我們複製兩個字符串時,我們得到了這個BAD_ACCESS。該方法的 代碼如下,鏈接到我們的代碼庫是在這裏:Github RepoBAD_ACCESS with strcpy in shared memory(C)

int put(int key, char *value, char *resp){ 
int emptyIndex = -1; 
//strcpy(resp, ""); 
resp = ""; 
for(int i = 0; i < STORELENGTH; i++){ 
    // If the key exists, overwrite it, give back previous value, and return true 
    if(kv[i].key == key) { 
     resp = kv[i].value; 
     kv[i].value = value; 
     return 1; 
    } 
    // If the key doesn't exist, remember the empty index 
    if(kv[i].key == NULL){ 
     emptyIndex = i; 
    } 
} 

// If there was an empty index, just reuse it 
if(emptyIndex > -1) { 
    kv[emptyIndex].key = key; 
    resp = ""; 
    kv[emptyIndex].value = value; 
    return 1; 
} 

*resp = (char) "Error: Put was not successful."; 
return -1; 
} 

正如你看到的,strcpy的,功能是註釋,因爲PROGRAMM立刻停止工作。 感謝您的幫助, 亞歷

+4

你覺得'* RESP =(char)的「錯誤:將未成功」'將完成?該投射應該暗示您做錯了事,不要盲目盲目投射,以免沉默編譯器警告。 –

+0

至於你的問題,什麼*是*'resp'?你傳遞給函數的是什麼?你怎麼稱呼它?你能否請嘗試創建一個[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)並向我們展示? –

+1

C中的參數是按值傳遞的,而不是引用。如果您之後立即返回,爲'resp'指定一個新值是毫無意義的。你似乎對「休息」的目的是什麼感到困惑。 –

回答

1

假設,即RESP應該在你的main.c你是不正確初始化一個字符串:

char *resp = ""; <- This one is bad 
//char resp[BUFSIZ]; <-- This one is good but commented. 

因此,你有一個resp作爲一個字符*分配的大小爲1.雖然strcpy需要至少爲2的大小 - 「」您複製一個用於「\ 0」 - 字符串終止字符。這就是爲什麼當您嘗試將長度爲1的resp中的長度設置爲2時,您的應用崩潰 - 您正嘗試寫入您不屬於自己的內存。

,而不是另外:

*resp = (char) "Error: Put was not successful."; 

您應該使用strcpy也。我建議如下:

1.閱讀有關數組和指針,以更好地理解它

2.閱讀文檔,如果他們是新的給你,你正在使用,像strcpy功能。它包含像一些有價值的信息:

To avoid overflows, the size of the array pointed by destination shall be long enough to contain the same C string as source (including the terminating null character), and should not overlap in memory with source.

3.瞭解調試 - IMHO,這是最重要的事情之一! 例如this link描述了一些內存分配和調試技術。

所有這一切都可以讓你的生活更輕鬆的未來:)