Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用指向字符数组的指针_C_Pointers - Fatal编程技术网

C 使用指向字符数组的指针

C 使用指向字符数组的指针,c,pointers,C,Pointers,我想传递一个指向函数指针的指针,在函数中分配内存,用字符串填充它,然后把它取回来,但这一切似乎都不起作用。程序在函数外不打印任何内容。有一些最重要的代码: 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 N

我想传递一个指向函数指针的指针,在函数中分配内存,用字符串填充它,然后把它取回来,但这一切似乎都不起作用。程序在函数外不打印任何内容。有一些最重要的代码:

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*计数器,字符**键)
{
*计数器=0;
//获取一些记录,其编号为*计数器,每个字符串的最大长度为64
//计数器不是0!它的值取决于我在这里没有写过的其他操作
//...        
keys=(char**)malloc((*计数器)*(sizeof(char*));
对于(j=0;j<*计数器;j++)
{
键[j]=(char*)malloc(64*sizeof(char));
}
strcpy(键[j],键.dptr);
printf(“大小%d:\n”,大小(**键));//1
printf(“大小%d:\n”,大小(*键));//4
printf(“大小%d:\n”,大小(键[0]);//4
printf(“大小%d:\n”,大小(键));//4
//...
}
/*函数外,函数内OK*/
字符**键;
整数计数;
结果=getRegEx(&count,&keys)//&钥匙或钥匙-没有区别
对于(int k=0;k<*count;k++)//测试
{
printf(“数据库中的键%s:s\n”,键[k]);//什么都没有!?
}

我用类似于
struct record**getRegEx(int*counter,char***keys)
的东西替换函数头(并在函数中使用*keys和*keys[I]而不是key和keys[I]),从而实现了这一功能。谢谢大家

您正在将零传递给
malloc
,因此在
键中没有可返回的内容

您的
for
循环永远不会运行


这两种情况都是因为
(*计数器)
为零。

您正在将零传递给
malloc
,因此您在
键中没有要返回的内容

您的
for
循环永远不会运行


两者都是因为
(*计数器)
为零。

您有一个函数
getRegEx
,该函数被声明为返回一个
结构记录**

你知道这个函数缺少什么吗?

任何看起来像
return
语句的内容

您有一个函数
getRegEx
,它被声明为返回一个
结构记录**

你知道这个函数缺少什么吗?
任何看起来像
return
语句的内容

  • 这里有一个严重的问题:

    results = getRegEx(&count, &keys); //&keys or keys - makes no difference
    
    你的评论是错误的,它确实起了作用<代码>键
  • 的类型为
    char**
    (这是
    getRegEx
    所期望的),
    的类型为
    char***

  • 函数有一个返回类型,但不返回任何内容

  • 为函数中的
    变量分配动态内存,但函数(如所写)无法将该内存从函数中传递出去。您的函数应采用
    字符***
    ,并应将其作为
    (如前所述,其类型为
    字符***

  • 由于在函数开始时设置了
    *count=0
    (此时不应该在函数中设置它,应该通过值而不是指针传递
    count
    ),因此大小始终为零。
    malloc(0)
    的确切效果由实现定义

  • 您可以强制转换
    malloc
    的返回值。这不是错误的,但在C中是不必要的(如果你真的使用C++,你应该这么说),并且可以让事情变得更难。

  • 您从不检查
    malloc
    的返回值是否失败

  • 在声明计数器的函数外部使用
    计数器
    指针。在函数调用之外,应该使用作为参数传递的
    count
    变量。函数参数在其使用的函数之外不会继续存在

  • 这里有一个严重的问题:

    results = getRegEx(&count, &keys); //&keys or keys - makes no difference
    
    你的评论是错误的,它确实起了作用<代码>键
  • 的类型为
    char**
    (这是
    getRegEx
    所期望的),
    的类型为
    char***

  • 函数有一个返回类型,但不返回任何内容

  • 为函数中的
    变量分配动态内存,但函数(如所写)无法将该内存从函数中传递出去。您的函数应采用
    字符***
    ,并应将其作为
    (如前所述,其类型为
    字符***

  • 由于在函数开始时设置了
    *count=0
    (此时不应该在函数中设置它,应该通过值而不是指针传递
    count
    ),因此大小始终为零。
    malloc(0)
    的确切效果由实现定义

  • 您可以强制转换
    malloc
    的返回值。这不是错误的,但在C中是不必要的(如果你真的使用C++,你应该这么说),并且可以让事情变得更难。

  • 您从不检查
    malloc
    的返回值是否失败

  • 在声明计数器的函数外部使用
    计数器
    指针。在函数调用之外,应该使用作为参数传递的
    count
    变量。函数参数在其使用的函数之外不会继续存在

  • 主要问题:

  • 你的类型不匹配。在调用
    getRegEx(&count,&keys)
    时,表达式
    &keys
    的类型是
    char***
    ,而不是
    char**
    。请注意,如果要修改
    键的值,必须向其传递指针。这导致了下一个问题

  • 因为您正在修改参数
    键的值,而不是它所指向的值,所以您在函数中所做的任何更改都不会反映在调用方中

  • 这是一个莫迪菲