2017-03-15 27 views
0

我在這個問題有一段時間一直盯着我似乎不能找到一個顯而易見的解決方案,也沒有描述具體問題的詞彙。我會盡我所能:C函數輸入被莫名其妙地採取同樣的內存地址

#include <stdio.h> 
#include <malloc.h> 
#include <string.h> 

char** findWords(char** words, int wordsSize, int* returnSize) { 

    *returnSize = 15; //<- wordsSize and returnSize have the same memory address???? 

    printf("wordsSize is %d\n", wordsSize); 
    for(int i=0; i<wordsSize; i++) 
    { 
     printf("i: %d first word: %s, len: %d\n", i, words[i], strlen(words[i])); 
    } 
} 

int main(void){ 
    char **test; // this should be const char but func decl is predefined 

    test[0] = "Hello"; 
    test[1] = "Alaska"; 
    test[2] = "Dad"; 
    test[3] = "Peace"; 


    int *foo; 

    findWords(test, 4, foo); 

    printf("%d", *foo); 

} 

當findWords()被調用時,我看到& wordsSize和* returnSize是相同的(即它們具有相同的內存地址)

[New Thread 3492.0x9d0] 

Breakpoint 1, findWords (words=0x7efde000, wordsSize=4, returnSize=0x28ff24) at keyboardrow.c:15 
15   printf("wordsSize is %d\n", wordsSize); 
(gdb) print &wordsSize 
$1 = (int *) 0x28ff24 
(gdb) print returnSize 
$2 = (int *) 0x28ff24 
(gdb) 

上午我錯過明顯的東西?在我看來,wordsSize和returnSize應該有不同的內存地址,因爲它們是兩個單獨的變量。

+0

你的程序的行爲是不確定的。你沒有初始化'test',那麼它是指向'test [0]'分配的是什麼? – StoryTeller

+0

你想找到並閱讀一本好的C書。你也想看看你的編譯器給你的警告。不這樣做==浪費你的時間。將'-Wall -Wextra -Wpedantic -Werror'添加到您的編譯標誌。 –

+0

謝謝,我重新閱讀K&R2,和我已經添加這些標誌 - 它提出了一個:「測試」是在此函數中使用的未初始化[-Werror =未初始化] 測試[0] =「你好」; – jaytielle

回答

1

問題是

test[0] = "Hello"; 
test[1] = "Alaska"; 
test[2] = "Dad"; 
test[3] = "Peace"; 

所有這些調用undefined behavior,如test,它自己沒有指向一個有效內存。

可以提領test獲得test[n]之前,您需要確保test指向它有足夠的尺寸,使test[n]訪問一個有效的一個有效的內存。

而是上面的代碼中,你可以簡單的寫

char * test[] = { "Hello", "Alaska", "Dad", "Peace" }; 

並能與它完成。

+1

謝謝,我沒有意識到這一點可能會讓代碼的其他部分如此顯着。函數調用不幸期待字符**的話:再\ [鏈接](https://leetcode.com/problems/keyboard-row/#/description) – jaytielle

+0

@jaytielle改變函數簽名....這是不言而喻的。 –

+0

我可能是誤解了,預期的格式是 字符** findWords(字符**換句話說,int wordsSize,INT * returnSize){} - 我不得不使用該函數聲明。 – jaytielle

2
char **test; // this should be const char but func decl is predefined 

test[0] = "Hello"; 
test[1] = "Alaska"; 
test[2] = "Dad"; 
test[3] = "Peace"; 

你不能做你在做什麼以上。 test並不指向任何「有意義」的地方。

+0

它確實指向某處,只是我們無法確定「哪裏」部分。 :) –

+0

@SouravGhosh是的,當然 –

0

既然你是通過調用一個指針不指向任何地方調用未定義的行爲,各種變量/指針會指向相同的內存地址,就像在不同的變量可以包含相同的垃圾值的情況下!

相關問題