2011-06-26 36 views
1

這有什麼代碼的問題(這是[0]正確打印改編,但我正在用改編的問題[1] ...打印一些奇怪的字符):問題爲char *值

using namespace std; 
char ** setName() { 
    char * arr[2]; 
    for (int i=0;i<2;i++) 
     arr[i] = (char*)malloc(100); 
    arr[0] = strdup("Robert"); 
    arr[1] = strdup("Jose"); 
    return arr; 
} 
int main() 
{ 
    char **arr; 
    arr = setName(); 
    printf("First name is %s\n", arr[0]); 
    printf("Second name is %s\n", arr[1]); 
    return 0; 
} 

如果它很重要,我在Windows中使用Visual Studio 8運行此代碼。

+0

你不需要malloc的,爲的strdup分配反正 – thumbmunkeys

+3

世界你爲什麼混合'malloc'和'用C++代碼printf'使用了' std'命名空間?選擇一種語言並堅持使用它:C或C++。 –

+2

使用'std :: vector ',你會更快樂。 –

回答

5

你必須在代碼兩個問題:

  1. 一個auto陣列(例如您的char * arr[2])不會使用new[]自動創建;它的存儲在函數返回時消失。這是垃圾的來源。你應該malloc()new[]它。

    char **arr = malloc(2 * sizeof (*char)); 
    
  2. strdup()做了malloc(),讓你白白malloc()荷蘭國際集團存儲,然後將其丟失,因爲您覆蓋指針。

2

您的指針數組是本地的您的setName函數。

試着這麼做:

char ** setName() { 
    char ** arr = (char **)malloc(2 * sizeof(char *)); 
    for (int i=0;i<2;i++) 
    arr[i] = (char*)malloc(100); 
    strcpy(arr[0], "Robert"); 
    strcpy(arr[1], "Jose"); 
    return arr; 
} 

...不要忘記你free什麼malloc

4

您正在返回本地變量的地址。 arrsetName退出後不存在,因此mainarr指向錯誤的內存。

你會通過將其作爲參數傳遞給setName最好還是寫信直入mainarr

using namespace std; 
void setName(char* (&arr)[2]) { 
    for (int i=0;i<2;i++) 
     arr[i] = (char*)malloc(100); 
    arr[0] = strdup("Robert"); 
    arr[1] = strdup("Jose"); 
} 
int main() 
{ 
    char * arr[2]; 
    setName(arr); 
    printf("First name is %s\n", arr[0]); 
    printf("Second name is %s\n", arr[1]); 
    return 0; 
} 
0

您正在返回arr的地址。這是未定義的行爲,你真的不知道會發生什麼。我強烈建議你通過引用向該函數添加一個參數,並將arr從main傳遞給它,而不是返回。

0

您的代碼可以是這樣的:

char *setName() { 
     char * arr[2]; 
     static int j=0; 
     int i=0; 
     for (i=0;i<2;i++) 
      arr[i] = (char*)malloc(100); 
     strcpy(arr[0],"Robert"); 
     strcpy(arr[1],"Jose"); 
     return arr[j++]; 
    } 

    int main(){ 
     char *arr1,*arr2; 
     arr1 = setName(); 
     arr2 = setName(); 
     printf("First name is %s\n", arr1); 
     printf("First name is %s\n", arr2); 
     return 0; 
    }