2013-01-19 249 views
17

對於C語言中的編碼,我相當新,現在正在嘗試創建一個返回c字符串/字符數組並賦值給變量的函數。從函數返回字符[] /字符串

到目前爲止,我觀察到返回char *是最常見的解決方案。所以我試過了:

char* createStr() { 
    char char1= 'm'; 
    char char2= 'y'; 
    char str[3]; 
    str[0] = char1; 
    str[1] = char2; 
    str[2] = '\0'; 
    char* cp = str; 
    return cp; 
} 

我的問題是我如何使用這個返回的char *並將它指向的char數組賦值給char []變量?

伊夫嘗試(所有導致NOOB溺水錯誤):

  1. 字符* CHARP = createStr();
  2. char myStr [3] = & createStr();
  3. char * charP = * createStr();

回答

21

注意,您不會動態分配變量,這幾乎意味着函數中str內部的數據在函數結束時會丟失。

你應該有:

char * createStr() { 

    char char1= 'm'; 
    char char2= 'y'; 

    char *str = (char *) malloc(sizeof(char) * 3); 
    str[0] = char1; 
    str[1] = char2; 
    str[2] = '\0'; 

    return str; 

} 

然後,當你調用該函數,將接收數據的變量的類型必須匹配函數返回的。所以,你應該有:

char *returned_str = createStr(); 
+4

'sizeof(char)'保證爲1並且沒有理由對'malloc'進行類型轉換返回 –

+1

@Aniket +1感謝您的評論。我有時被朋友告知,但我想我當時並不明白這個問題,後來又沒有想到這一點:D – Rubens

5

如果你想從一個函數返回一個char*,請確保你的malloc()它。堆棧初始化字符數組在返回時沒有意義,因爲從該函數返回後訪問它們是未定義的行爲。

將其更改爲

char* createStr() { 
    char char1= 'm'; 
    char char2= 'y'; 
    char *str = malloc(3 * sizeof(char)); 
    if(str == NULL) return NULL; 
    str[0] = char1; 
    str[1] = char2; 
    str[2] = '\0'; 
    return str; 
} 
+5

值得一提的是,必須釋放返回值以防止內存泄漏。 'char * astr = createStr(); doSomething的(而aStr);免費(astr);' – Vassilis

+0

這就是我一直在尋找的!我有點困惑,因爲從函數返回一個指針可能會導致內存泄漏。你的回答解決了我的問題。因此,char * astr持有的內存最終被釋放。 (在Java中,例如,我明白這不是問題,因爲垃圾回收器會小心) – hrushi

5
char* charP = createStr(); 

將是正確的,如果你的函數是正確的。不幸的是,你正在返回一個指向函數中局部變量的指針,這意味着函數返回時它是一個指向未定義數據的指針。你需要使用像malloc這樣的堆分配函數爲你的函數中的字符串賦值,以便返回的指針具有任何意義。然後你需要記住稍後釋放它。

0

包括「string.h」使事情變得更容易。一個更簡單的方法來解決您的問題是:

#include <string.h> 
    char* createStr(){ 
    static char str[20] = "my"; 
    return str; 
} 
int main(){ 
    char a[20]; 
    strcpy(a,createStr()); //this will copy the returned value of createStr() into a[] 
    printf("%s",a); 
    return 0; 
} 
+0

爲什麼要複製? 'char * a = createStr();'會工作相同。 – melpomene

+0

是的,你也可以使用它,這將節省一些內存,這只是他要求一種方法來「將char數組(函數)指向char []變量」,所以我告訴他這一點。 – Adnan