2015-03-08 82 views
-1

所以,我正在研究這個hang子手遊戲。我在數組和指針方面有點麻煩。這是我有:在C函數中返回一個數組中的項目

char* getword(int index); 
int main (void) { 

char *secword = getword(1); 
printf("%s ", *secword); 
} 

char *getword(int index) 
{ 
char *words[8]= {'bye', 'hi','what', 'cat', 'dog', 
        'bird', 'air', 'water', 'fire'}; 
return words[index]; 
} 

我不斷收到一個分段錯誤(核心轉儲)錯誤。

+4

C中的字符串使用雙引號。該陣列中還有9個字符串,而不是8個。 – 2015-03-08 21:05:03

+1

是的 - 你是如何設法達到段錯誤的? – 2015-03-08 21:06:28

+1

使用'char const *'而不是'char *',並且您需要使用'printf(「%s」,secword);'或'printf(「%c」,* secword);'。並注意編譯器消息;如果有任何警告或錯誤,甚至不打擾你的程序運行 - 首先解決錯誤。 – 2015-03-08 21:06:59

回答

1

你有四個重要的錯誤

  1. 不能使用getword()功能words外面是因爲它在函數的棧幀的已分配。

    所以當函數返回時,數組被解除分配,從而發生未定義的行爲。

  2. 您的陣列中不包含字符串,而是多字符包含而不是。 多字符常量是有效的,但是已經定義了實現,所以不能依賴它們來實現便攜式程序。

    因爲您未啓用警告,所以您的代碼編譯,然後當您嘗試訪問這些打印值的地址時,將依賴於多字符常量實現的整數值分配給數組的poitners他們然後發生未定義的行爲。

  3. printf()需要一個char指針每個"%s"符,*secword具有類型char所以這也是錯誤的,它再次編譯,因爲你沒有啓用編譯器警告。

  4. 您正在用9字初始化數組,而不是8,這是編譯器警告會報告的另一個問題。

您有2個選項

  1. words靜在getword()功能

    const char *getword(int index); 
    int main (void) 
    { 
        char *secword = getword(1); 
        printf("%s\n", secword); 
    } 
    
    const char *getword(int index) 
    { 
        static const char *words[9] = {"bye", "hi", "what", "cat", "dog", 
                "bird", "air", "water", "fire" 
        }; 
        return words[index]; 
    } 
    
  2. 聲明words主,並將其傳遞給getword()

    const char *getword(int index, const char *words[]); 
    int main (void) 
    { 
        const char *words[9] = {"bye", "hi", "what", "cat", "dog", 
              "bird", "air", "water", "fire" 
        }; 
        char *secword = getword(1, words); 
        printf("%s\n", secword); 
    } 
    
    const char *getword(int index, const char *words[]) 
    { 
        return words[index]; 
    } 
    

我一直在寫c程序一段時間,並且我使用盡可能多的警告,如果我是一個新的程序員學習c,我會盡可能地啓用更多的警告。

+0

有一個upvote - 我想知道什麼時候有人最終會建議const。 – 2015-03-09 05:30:28

+0

'static'是不必要的,而'words'在返回後無效,'words [index]'是(字符串文字具有靜態存儲持續時間)。根據我的經驗,注意警告是比建議請求更多的更重要的部分 - 除了3,編譯器已經警告過(如果它不是ANSI之前的編譯器,我認爲)。 – mafso 2015-03-09 08:52:31

0
char* getword(int index); 

int main (void) { 
     char *secword = getword(1); 
     printf("%s ", secword); 
} 

char *getword(int index) 
{ 
    static char *words[9]= {"bye", "hi","what", "cat", "dog", 
        "bird", "air", "water", "fire"}; 
    return words[index]; 
} 

應該是這樣的......

0

有幾件事情是不對您的程序:

  1. 當使用char*變量(或任何指針),你必須始終分配他們首先用malloc記憶它們。不要忘記釋放它。手動分配內存的替代方法是使用固定大小的數組。

  2. 打印時不要對字符串取消引用(printf("%s ", *secword))。

  3. 確保在聲明數組時指定正確數量的元素(有9個,而不是8個),並且不要忘記檢查是否跨越數組邊界。

  4. 在C中,所有的字符串都是雙引號;單引號表示字符常量。