2011-04-25 30 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以获取数组的地址,然后我们将下标。

相关问题