2011-04-25 29 views
0

我想傳遞指向指向函數的指針的指針,在函數中分配內存,用字符串填充它並將其取回,但似乎都沒有工作。程序不在功能外打印。有代碼的最重要的部分:使用指向字符數組的指針

struct record ** getRegEx(int *counter, char** keys) 
{ 
    *counter = 0; 
    //get some records, its number is *counter, max lenght of each string is 64 

    //COUNTER IS NOT 0! ITS VALUE DEPENDS ON OTHER OPERATIONS I HAVENT WRTTEN HERE 
    //...   
    keys =(char **) malloc((*counter)*(sizeof(char *))); 
    for (j = 0; j < *counter; j++) 
    { 
     keys[j] = (char*)malloc(64*sizeof(char));    
    } 

    strcpy(keys[j],key.dptr); 

    printf("size %d : \n", sizeof(**keys));//1 
    printf("size %d : \n", sizeof(*keys));//4 
    printf("size %d : \n", sizeof(keys[0]));//4 
    printf("size %d : \n", sizeof(keys));//4  
    //... 
} 


/*Out of the function, inside the function OK*/ 
char** keys; 
int count; 
results = getRegEx(&count, &keys); //&keys or keys - makes no difference 
for(int k=0 ; k< *count;k++) //test 
{ 
    printf("keys in db %s: s\n", keys[k]); //nothing!? 
} 

我做它的工作方式與一些替代函數頭像struct record ** getRegEx(int *counter, char*** keys)(使用*鍵和*鍵的[I],而不是鍵和鍵[I]裏面的功能)。感謝所有!

回答

2
  1. 這裏有一個嚴重的問題:

    results = getRegEx(&count, &keys); //&keys or keys - makes no difference 
    

    您的評論是錯誤的 - 它確實有所作爲。 keys的類型爲char **(其getRegEx預計),&keys的類型爲char ***

  2. 你的函數有一個返回類型,但什麼都不返回。

  3. 你分配在功能您keys變量的動態內存,但功能(因爲它寫的)不能通過內存出功能。你的函數應該採取char ***,你應該把它作爲&keys(其中,如前所述,是char ***型的。)

  4. 你的大小始終將是零,因爲你在年初設定*count = 0您函數(當你不應該在你的函數中設置它時,應該通過值而不是指針傳遞count)。 malloc(0)的確切影響是實現定義的。

  5. 您投下返回值malloc。這沒有錯,但在C語言中是不必要的(如果你真的使用C++,你應該這樣說),並且可以讓事情變得更加艱難。

  6. 您從不檢查malloc的返回值是否失敗。

  7. 您可以在聲明函數外部使用counter指針。在函數調用之外,您應該使用您作爲參數傳遞的count變量。函數參數不會在它們使用的函數之外繼續存在。

3

您正在將零傳遞給malloc,因此您無法在keys中返回任何內容。

您的for循環從不運行。

兩者都是因爲(*counter)爲零。

+2

不,他將垃圾傳遞給'malloc'。 – 2011-04-25 21:03:15

+2

那麼,他設置*計數器爲零,然後通過((*計數器)*(sizeof(char *)))到malloc,即0。 – 2011-04-25 21:06:04

+0

我的壞,我錯過了那條線。 – 2011-04-25 21:09:25

0

您有一項功能getRegEx,即聲明爲返回struct record **

你知道該功能缺少什麼?
任何看起來像return聲明!

1

主要問題:

  1. 你的類型不匹配。在致電getRegEx(&count, &keys)時,表達式&keys的類型是char ***,而不是char **。請注意,如果您想修改keys的值,則必須將指針傳遞給它。這導致下一個問題...

  2. 因爲您正在修改參數keys的值,而不是它指向的值,所以您在函數中所做的任何更改都不會反映到調用者中。

這是你的代碼的修改版本,說明了什麼,我想正在試圖做的事:

struct record **getRegEx(int *counter, char ***keys) 
{ 
    ... 
    // type of keys = char *** 
    // type of *keys = char ** 
    // type of **keys = char * 

    *keys = malloc(*counter * sizeof **keys); // note no cast, operand of sizeof 
    if (*keys) 
    { 
    int j; 
    for (j = 0; j < *counter; j++) 
    { 
     // type of (*keys)[j] == char * 
     // type of *(*keys)[j] = char 

     (*keys)[j] = malloc(64 * sizeof *(*keys)[j]); 
    } 
    } 
    ... 
} 

請注意,我不投的malloc結果。從1989年版的C標準開始,你不必這樣做,所以它可以避免視覺混亂。它也可以保護你免受潛在的錯誤;如果您忘記在範圍中包含stdlib.h或者其他方式不需要爲malloc創建原型,編譯器將假定函數返回int。如果沒有演員表,您將按照「不兼容的分配類型」的順序進行診斷。添加演員將抑制診斷,並且結果可能會有微妙(或不那麼微妙)的運行時錯誤。

此外,請注意,我使用sizeof對象,而不是類型。同樣,這有助於減少視覺混亂,並且在您決定更改keys的基本類型時也可以保護您;您不必每次更新每個malloc調用。

爲什麼(*keys)[j]而不是*keys[j]?表達式keys不是我們數組開頭的位置,而是指向那個位置。我們必須取消keys以獲取數組的地址,然後我們將下標。

相關問題