2017-01-14 55 views
1

爲什麼我的功能printTable打印我的數組的內容?例如,從存儲在我的數組中的整個單詞'oui'它只打印'o'?指針和局部數組用C

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <time.h> 

#define libraryDimension 12 
char* getFirstElementPointerOfMysteryWord(void); 
char getCarac(void); 
void printTable(char*ptr,int dimension); 

/* Main program*/ 
int main() { 
    //getCarac(); 
    char *pointerForFirstElement = getFirstElementPointerOfMysteryWord(); 
    int tableDimension = 3; 
    printTable(pointerForFirstElement, tableDimension); 

    return 0; 
} 

該功能的目的是提供一個選擇的話它有沒有參數,它返回我的字的數組的第一個元素的地址。

char *getFirstElementPointerOfMysteryWord(void) { 
    int randomNumbers[3] = {0}; 
    char mysteryWord[4]; 
    char wordLibrary[libraryDimension]; 
    wordLibrary[0] = '#'; 
    wordLibrary[1] = 'n'; 
    wordLibrary[2] = 'o'; 
    wordLibrary[3] = 'n'; 
    wordLibrary[4] = '#'; 
    wordLibrary[5] = 'o'; 
    wordLibrary[6] = 'u'; 
    wordLibrary[7] = 'i'; 
    wordLibrary[8] = '#'; 
    wordLibrary[9] = 'q'; 
    wordLibrary[10] = 'u'; 
    wordLibrary[11] = 'i'; 
    wordLibrary[12] = '\0'; 

    int j=0; 
    for (int i = 0; i<libraryDimension; i++) { 
     if(wordLibrary[i] == '#') { 
      randomNumbers[j] = i; 
      j++; 
     } 
    } 

    srand(time(NULL)); 
    int index = rand() % 3; 
    int randomNumber = randomNumbers[index]; 
    int k=0; 
    for (int i = randomNumber ; i< libraryDimension-1 ; i++) { 
     if(wordLibrary[randomNumber+k+1] == '#'){ 
      break; 
     } 
     else{ 
      mysteryWord[k] = wordLibrary[randomNumber+1+k]; 
      k++; 
     } 
    } 
    return mysteryWord; 
} 

這是我的代碼無法正常工作的部分。

void printTable(char *ptr,int dimension) { 
    for (int i = 0; i <dimension ; i++) { 
     printf("%c",*(ptr+i)); 
    } 

} 

char getCarac(void){ 
    char carac; 
    carac = getchar(); 
    return carac; 
} 
+2

普通的初學者錯誤PASS陣列。 'return mysteryWord;'。那是錯的。 'mysteryWord'是一個局部變量,當函數退出時超出範圍(不再有效)。在函數外部使用這種變量會導致未定義行爲。 – kaylum

+0

感謝您的回答,我應該再使用它作爲一個全局變量或者是有沒有辦法只用指針來操作呢? –

+0

你應該在返回之前製作它的副本(例如,用'strdup')。順便說一句,爲什麼你以這種奇怪的方式初始化字符串變量?您可以do'char wordLibrary [] =「非#OUI#魁#」;' – DyZ

回答

0

當你在一個函數中聲明一個變量時,它被分配到棧中。當變量超出範圍即函數結束時,變量消失(棧是本地的功能),從而通過返回數組的地址要返回不再存在的地址。

相反要麼在堆中使用malloc

char *mysteryWord = malloc(4); 

或更好地分配存儲,有它聲明的功能外,然後將其傳遞給函數來填充。

void getFirstElementPointerOfMysteryWord(char* mysterword, size_t maxLen) 
0

的問題就在這裏

char *getFirstElementPointerOfMysteryWord(void) 
{ 
    char mysteryWord[4]; 

     /* other stuff */ 

    return mysteryWord; 
} 

mysteryWord停止時存在的函數返回。調用者對其進行的任何解引用(例如,檢查其內容)或將其傳遞給另一個解引用的函數(您的代碼所執行的操作)都會導致未定義的行爲。

您需要確保任何指針調用者接收,它繼續在東西,這將呼叫者存在點。這可以通過各種方式完成,每種方式都有不同的權衡。也許最簡單的是用於呼叫者與4種元素作爲參數傳遞給該功能(如果主叫方擁有它,也不會停止存在,直到呼叫者內的當前範圍結束)