首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C语言基础,字符串到指针

C语言基础,字符串到指针
EN

Stack Overflow用户
提问于 2012-02-03 04:45:03
回答 4查看 186关注 0票数 0

我有3个文件的项目。公共头部包含检查mysql连接的函数声明:

代码语言:javascript
复制
int conn_check(char **m_error);

主文件调用函数,并期望在出现错误时在m_error中显示一些消息:

代码语言:javascript
复制
if (!conn_check(&m_error)==0)
{
 printf("%s\n", m_error);
}

现在我有问题的函数,因为我对指针的了解很弱:

代码语言:javascript
复制
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打印错误消息。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-03 04:56:50

char **m_error意味着你正在传递一个指向一个指针的指针。这可能是因为函数已经返回了一个int,而您还希望获得错误的文本。实际上,您正在将堆栈变量的地址赋给指针,这是您不能做的。

您需要分配内存,将其分配给指针,然后写入:

代码语言:javascript
复制
*m_error = calloc(255, sizeof(char));
snprintf(*m_error, 255, "%u: %s", mysql_errno(conn), mysql_error(conn));

vasprintf()将为您完成所有这些工作:

代码语言:javascript
复制
vasprintf(m_error, "%u: %s", mysql_errno(conn), mysql_error(conn));

请注意,您随后需要在调用函数中对其执行free()操作。

票数 2
EN

Stack Overflow用户

发布于 2012-02-03 04:48:17

您将返回一个指向局部变量(char mysqlerror255)的指针。您应该在主文件中定义mysqlerror,并像这样调用您的函数:

代码语言:javascript
复制
 if (!conn_check(mysqlerror)==0)

并更改原型:

代码语言:javascript
复制
int conn_check(char *mysqlerror)

并删除行:

代码语言:javascript
复制
 char mysqlerror[255] = {0};
 *m_error = mysqlerror;
票数 1
EN

Stack Overflow用户

发布于 2012-02-03 04:52:13

conn_check()返回时,如果执行*m_error = mysqlerror;行,到那时您将得到一个非常可能无效的指针,因为本地字符数组mysqlerror在本地函数之外是无效的。

您需要传入一个指向缓冲区的指针并将字符串复制进去,或者使用strdup复制字符串以分配一些全局内存,以便为返回提供一个有效的指针(但如果您这样做了,以后不要忘记使用freemain()中释放内存)。

编辑:如果您选择传入一个缓冲区,那么传入最大缓冲区大小也是一个很好的做法,这样当您复制字符串时,不会使缓冲区溢出。

编辑2:用最少的代码修复现有代码的一种非常老套的方法当然是将mysqlerror声明为静态的,因此它在函数之外是有效的。我不推荐这样做,因为这意味着函数不是线程安全的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9119739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档