2016-04-28 36 views
0

在此代碼我希望得到一些朋友,然後讓名字我想要的字符串將動態與我有2個功能使用的用戶輸入的lengh分配:動態字符指針數組爲字符串

void getNum(char** names, int* num) 
{ 
    //somecode 
    names = (char*)malloc(*num * sizeof(char)); 
    //check 
} 

void getNames(char** names, int* num) 
{ 
    int i = 0; 
    int len = 0; 
    char name[LEN] = { 0 }; 

    getchar(); //buffer cleaning 
    for (i = 0; i < *num; i++) 
    { 
     printf("enter #%d friend name: ", i+1); 
     myFgets(name, LEN); //getting name and cleaning "\n" at end 
     len = strlen(name)+1; // getting the size of string include "/0" 
     *(names + i) = (char*)malloc(len * sizeof(char)); 
     if (*(names[i]) == NULL) 
     { 
      printf("Error allocating memory!\n"); //print an error message 
      return 1; //return with failure 
     } 
     strncpy(*names, name, len); 
    } 
} 

第二次動態分配對我來說並不奏效,溢出錯誤:「訪問衝突寫入位置」。如果第一次分配將在第二個函數中,它將正常工作。你能解釋一下嗎?我需要爲它做些什麼才能以這種方式工作? 預先感謝您...

+0

編譯所有警告已啓用。並請顯示你如何調用'getnames'和'getNum'。 –

+1

我猜:'names =(char *)malloc(* num * sizeof(char));'應該是'names =(char *)malloc(* num * sizeof(char *));' – LPs

+1

錯誤,'getNum'似乎毫無意義,因爲它在發佈的代碼中被* nothing *調用。 – WhozCraig

回答

1

假設第一函數應分配指針數組,並且所述第二應該分配個別字符數組來存儲個人姓名,而是缺乏的間接電平在第一功能:

  • 傳遞給它一個拷貝一個char**(C通過拷貝傳遞參數)
  • 你只使用本地拷貝來存儲malloc的結果(這是錯誤的BTW)並且仍然保持調用者的原始值並且最終在離開函數時得到內存泄漏因爲沒有任何東西指向已分配的塊

它應該是:

char** getNum(int num) /* no need to pass num by reference */ 
{ 
    char **names; 
    //somecode 
    names = malloc(num * sizeof(char*)); /* do not cast resul of malloc in C */ 
    //check 
    return names 
} 

而在第二個函數,你應該consistenly爲names[i](或*(names + i))分配內存,測試它的NULL和複製那裏的字符串:

names[i] = malloc(len * sizeof(char)); 
    if (names[i] == NULL) 
    { 
     printf("Error allocating memory!\n"); //print an error message 
     return 1; //return with failure 
    } 
    strncpy(names[i], name, len); 
2

在功能getNames,你使用了錯誤的指針來檢查NULLnames[i]*(names+i),不一樣的*(names[i]),也不要投malloc的返回值。無需使用sizeof(char),它總是1.

*(names + i) = (char*)malloc(len * sizeof(char)); 
if (*(names[i]) == NULL) // compare to the wrong pointer 
{ 
    printf("Error allocating memory!\n"); //print an error message 
    return 1; //return with failure 
} 
strncpy(*names, name, len); // copy to the wrong buffer 

嘗試以下操作:

names[i] = malloc(len); 
if (names[i] == NULL) 
{ 
    printf("Error allocating memory!\n"); 
    return 1; //return with failure 
} 
strncpy(names[i], name, len); 

此外,在getNum,要分配給字符指針數組,使用

void getNum(char ***names, int *num) { 
    *names = malloc(*num * sizeof(char*)); 
} 

你將它叫做

char **names; 
getNum(&names, &num); 

您也可以通過執行char **getNum(...)返回。

+0

值得關注的是'getNum'將*沒有效果*無論呼叫者傳遞給「名稱」,並且寫入的內容都會像內存泄漏雨水那樣泄漏內存。 – WhozCraig

+0

嗨,我做了你所說的一切,但我仍然有溢出錯誤...在第二個malloc中... –

+1

由'getNum'分配的內存丟失了,因爲參數只是原始指針的副本而傳遞'name',請參閱更新。 – fluter