Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.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初学者问题:指向指针的指针/Can';t从函数外部访问值_C_Function_Pointers - Fatal编程技术网

C初学者问题:指向指针的指针/Can';t从函数外部访问值

C初学者问题:指向指针的指针/Can';t从函数外部访问值,c,function,pointers,C,Function,Pointers,我正在向MySQL函数传递指向指针(**resultSet)的指针 下面是我如何从函数中复制MySQL数据的摘录: int getItems(char * cmd, char **resultSet) { ... MYSQL initialisations and set-up ... resultSet = malloc(sizeof(char)*(int)mysql_num_rows); while((row = mysql_fetch_row(result)))

我正在向MySQL函数传递指向指针(**resultSet)的指针

下面是我如何从函数中复制MySQL数据的摘录:

int
getItems(char * cmd, char **resultSet)
{

...
MYSQL initialisations and set-up
...



    resultSet = malloc(sizeof(char)*(int)mysql_num_rows);

    while((row = mysql_fetch_row(result))) 
    {

            for (i=0 ; i < mysql_num_fields(result); i++)               
            {   
            printf("%i: \t", i);        
            resultSet[counter] = malloc(sizeof(char)*strlen(row[i])+1);
            strcpy(resultSet[counter], row[i]);
            printf("%s\n", resultSet[counter]);
            }
            printf("---------------------\n");
            counter++;      
    }
...
MYSQL cleaning up
...
return 0;
}
从my getItems函数中

printf("%s\n", resultSet[0]);
似乎有效

然而,如果我试图从我的函数外部访问它,我会得到一个分段错误。为什么会这样?

您可能想要:

resultSet = malloc(sizeof(void *)*(int)mysql_num_rows);
而不是:

resultSet = malloc(sizeof(void)*(int)mysql_num_rows);
因为您需要的是指针而不是字节。

您可能需要:

resultSet = malloc(sizeof(void *)*(int)mysql_num_rows);
而不是:

resultSet = malloc(sizeof(void)*(int)mysql_num_rows);

因为您需要的是指针而不是字节。

您可能只需要将返回值(或参数)设置为&resultSet。但是我们可以确定是否向函数显示了参数以及函数的调用。

您可能只需要将返回值(或参数)设置为&resultSet。但是我们可以确定您是否向函数显示了参数以及函数的调用。

如果您想使用resultSet作为返回参数,则需要进行函数签名

int getItems(char * cmd, char ***resultSet)
并在函数中使用它,如

*resultSet = malloc(sizeof(char)*(int)mysql_num_rows)
函数调用可能看起来像

char** results;
nitems = getItems(somecmd, &results); 

更好、更简单的方法可能是保持原样,在函数调用之前进行分配。

如果要使用resultSet作为返回参数,则需要进行函数签名

int getItems(char * cmd, char ***resultSet)
并在函数中使用它,如

*resultSet = malloc(sizeof(char)*(int)mysql_num_rows)
函数调用可能看起来像

char** results;
nitems = getItems(somecmd, &results); 
更好、更简单的方法可能是保持原样,在函数调用之前进行分配。

这里有两个问题:

  • 如前所述,resultset的分配是错误的
  • 其次,strlen(行[i]+1)将计算行[i]+1引用的内存位置的字符串长度。该长度将比第[i]行的字符串长度小1。由于您基本上是在复制以null结尾的字符串,请使用该函数:
    resultSet[counter]=strdup((char*)行[i])
不需要malloc和strcpy。

这里有两个问题:

  • 如前所述,resultset的分配是错误的
  • 其次,strlen(行[i]+1)将计算行[i]+1引用的内存位置的字符串长度。该长度将比第[i]行的字符串长度小1。由于您基本上是在复制以null结尾的字符串,请使用该函数:
    resultSet[counter]=strdup((char*)行[i])

不需要malloc和strcpy。

据我所知,您有一个char数组,需要用数据填充。您的初始分配应更改为:

resultSet = malloc(sizeof(char*)*(int)mysql_num_rows);
为了反映这一点(注意char*)

此外:

此行在技术上是正确的,但您应该将其更改为:

resultSet[counter] = malloc(sizeof(char) * (strlen(row[i])+1) );
反映您实际想要做的事情(原因是C执行算术的顺序,如果您尝试在除char/无符号char以外的任何其他数据类型上执行,第一种方法将产生错误的结果)

最后,我希望您以某种方式返回2d数组的值。有两种方法可以做到这一点:

  • 使函数返回字符**(失败时返回NULL)。这里不需要resultSet作为输入参数
  • int getItems(char*cmd,char***resultSet)
  • 请注意,函数中包含resultSet的所有内容都必须更改为*resultSet。然后可以使用以下命令调用该函数:

    char **result;
    int status = getItems(cmd, &result);
    

    据我所见,您有一个char数组,希望用数据填充它。您的初始分配应更改为:

    resultSet = malloc(sizeof(char*)*(int)mysql_num_rows);
    
    为了反映这一点(注意char*)

    此外:

    此行在技术上是正确的,但您应该将其更改为:

    resultSet[counter] = malloc(sizeof(char) * (strlen(row[i])+1) );
    
    反映您实际想要做的事情(原因是C执行算术的顺序,如果您尝试在除char/无符号char以外的任何其他数据类型上执行,第一种方法将产生错误的结果)

    最后,我希望您以某种方式返回2d数组的值。有两种方法可以做到这一点:

  • 使函数返回字符**(失败时返回NULL)。这里不需要resultSet作为输入参数
  • int getItems(char*cmd,char***resultSet)
  • 请注意,函数中包含resultSet的所有内容都必须更改为*resultSet。然后可以使用以下命令调用该函数:

    char **result;
    int status = getItems(cmd, &result);
    

    我们必须看到调用和函数decl才能回答这个问题。
    sizeof(void)
    看起来是错误的。也许您想要
    sizeof(void*)
    ?此外,您的代码根本不会更改
    resultSet
    指向的指针。sizeof(void)是多少?你想要sizeof(void*)还是我缺乏一些知识?这仍然是错误的-应该是
    sizeof(char*)
    是的,你们都做对了。它应该是sizeof(char*),因为我想要的是我的char指针的大小,而不是char本身。我尝试了这两种方法,它们似乎都有效,但我认为这只是因为char消耗了更多的内存。我想把清单保存在错误的malloc中,这样另一个看到这一点的初学者也可以从中学习。我的第三个回复实际上是针对Hogans comment的。我们必须看到调用和函数decl才能回答这个问题。
    sizeof(void)
    看起来是错误的。也许您想要
    sizeof(void*)
    ?此外,您的代码根本不会更改
    resultSet
    指向的指针。sizeof(void)是多少?你想要sizeof(void*)还是我缺乏一些知识?这仍然是错误的-应该是
    sizeof(char*)
    是的,你们都做对了。它应该是sizeof(char*),因为我想要的是我的char指针的大小,而不是char本身。我尝试了这两种方法,它们似乎都有效,但我认为这只是因为char消耗了更多的内存。我想把清单保存在错误的malloc中,这样另一个看到这一点的初学者也可以从中学习。我的第三个回复实际上是针对Hogans的评论。更好的是
    sizeof(char*)
    ,因为resultSet的单个元素实际上就是这样的,甚至更好的是
    sizeof(char*)
    ,因为这是