我有3个文件的项目。公共头部包含检查mysql连接的函数声明:
int conn_check(char **m_error);主文件调用函数,并期望在出现错误时在m_error中显示一些消息:
if (!conn_check(&m_error)==0)
{
printf("%s\n", m_error);
}现在我有问题的函数,因为我对指针的了解很弱:
int conn_check(char **m_error)
{
int retval = 0;
char mysqlerror[255] = {0};
MYSQL *conn;
conn = mysql_init(NULL);
if (conn)
{
if (mysql_real_connect(conn, mysql_server, mysql_user_name, mysql_password, "", (ulong)mysql_serverport, mysql_socket, 0)==NULL)
{
sprintf(mysqlerror, "%u: %s", mysql_errno(conn), mysql_error(conn));
*m_error = mysqlerror; // Problem here
retval = -1;
}
} else retval = -2;
mysql_close(conn);
return retval;
}问题是如何正确地将字符串mysqlerror分配给字符指针m_error,以便可以通过main中的printf打印错误消息。
发布于 2012-02-03 04:56:50
char **m_error意味着你正在传递一个指向一个指针的指针。这可能是因为函数已经返回了一个int,而您还希望获得错误的文本。实际上,您正在将堆栈变量的地址赋给指针,这是您不能做的。
您需要分配内存,将其分配给指针,然后写入:
*m_error = calloc(255, sizeof(char));
snprintf(*m_error, 255, "%u: %s", mysql_errno(conn), mysql_error(conn));vasprintf()将为您完成所有这些工作:
vasprintf(m_error, "%u: %s", mysql_errno(conn), mysql_error(conn));请注意,您随后需要在调用函数中对其执行free()操作。
发布于 2012-02-03 04:48:17
您将返回一个指向局部变量(char mysqlerror255)的指针。您应该在主文件中定义mysqlerror,并像这样调用您的函数:
if (!conn_check(mysqlerror)==0)并更改原型:
int conn_check(char *mysqlerror)并删除行:
char mysqlerror[255] = {0};
*m_error = mysqlerror;发布于 2012-02-03 04:52:13
从conn_check()返回时,如果执行*m_error = mysqlerror;行,到那时您将得到一个非常可能无效的指针,因为本地字符数组mysqlerror在本地函数之外是无效的。
您需要传入一个指向缓冲区的指针并将字符串复制进去,或者使用strdup复制字符串以分配一些全局内存,以便为返回提供一个有效的指针(但如果您这样做了,以后不要忘记使用free在main()中释放内存)。
编辑:如果您选择传入一个缓冲区,那么传入最大缓冲区大小也是一个很好的做法,这样当您复制字符串时,不会使缓冲区溢出。
编辑2:用最少的代码修复现有代码的一种非常老套的方法当然是将mysqlerror声明为静态的,因此它在函数之外是有效的。我不推荐这样做,因为这意味着函数不是线程安全的。
https://stackoverflow.com/questions/9119739
复制相似问题