C初学者问题:指向指针的指针/Can';t从函数外部访问值
我正在向MySQL函数传递指向指针(**resultSet)的指针 下面是我如何从函数中复制MySQL数据的摘录: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)))
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])代码>
- 如前所述,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数组的值。有两种方法可以做到这一点:
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数组的值。有两种方法可以做到这一点:
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*)
,因为这是