C-从字符[]创建常量字符*

C-从字符[]创建常量字符*,c,mysql-connector-c,C,Mysql Connector C,这似乎很简单,但我是C新手,在网上找不到任何人问这个问题。我用sprintf设置了一个char[]。然后我需要从char[]中生成一个const char*。这是可能的还是我需要和我的类型一起玩?我需要一个const char*来进入MySQL查询,但我需要char[]因为我需要使用sprintf将变量值插入到结果中。以下是代码片段: char sqlbuff[4096]; const char* sqlquery; sprintf(sqlbuff, " %s %s ", "SE

这似乎很简单,但我是C新手,在网上找不到任何人问这个问题。我用
sprintf
设置了一个
char[]
。然后我需要从
char[]
中生成一个
const char*
。这是可能的还是我需要和我的类型一起玩?我需要一个
const char*
来进入MySQL查询,但我需要
char[]
因为我需要使用
sprintf
将变量值插入到结果中。以下是代码片段:

char sqlbuff[4096];
const char* sqlquery;
sprintf(sqlbuff, " %s %s ",
        "SELECT idnum FROM idTbl WHERE idCol =", idVar);

sqlquery = &sqlbuff;

if ( mysql_query(con, sqlquery) ) 
{
    finish_with_error(con);
}
我尝试过以多种方式设置
const char
变量,但总是出现错误。如果我为
idVar
硬编码一个值,然后简单地运行

mysql_query(con, "SELECT idnum FROM idTbl WHERE idCol = 1300)
它很好用。问题是我需要使用
sprintf
来利用变量。感谢所有的帮助

编辑:在HP-UX 11.11上运行

我需要从这个
char[]

从您的代码示例中,您的意思似乎是想要一个指向
char[]
内容的
const char*
。这非常简单:

sqlquery = sqlbuff;
这是因为在几乎所有表达式上下文中,数组类型的值都会自动转换为指针,并且允许将非
const
类型的值分配给相应
const
限定类型的变量

此外,对于您显示的内容,您甚至不需要变量。您可以将数组的标识符指定为
mysql\u query
的参数。从数组到指针的自动转换同样适用于这里,您可以合理地将第二个参数类型中的
const
限定符解释为该函数不会试图修改指向的数据的承诺:

mysql_query(con, sqlbuf);
另一方面,你的尝试

sqlquery = &sqlbuff;  // wrong
,生成错误类型的指针
&sqlbuf
是指向数组的指针,而
sqlquery
被声明为指向字符的指针。指向
char[]
的第一个
char
的指针将指向与指向整个数组的指针相同的位置,但这两个指针的类型不同。

此行错误:

sqlquery = &sqlbuff;
sqlbuff
的类型为
char[]
,因此获取其地址将为您提供一个指向数组的指针,类型为
char(*)[]
。您只需要一个指向第一个
char
(键入
char*
)的指针,并且在大多数上下文中计算数组的标识符会得到这样一个指针(也有一些例外,例如与
sizeof
一起使用时)。所以,就写吧

sqlquery = sqlbuff;
也就是说,根本不需要单独的指针变量
sqlbuff
计算结果为
char*
,指针可隐式转换为其
const
限定的对应项。只要将
sqlbuff
直接传递到需要
const char*
的地方,它就会工作


另一件事应该提到,尽管与您的问题没有直接关系:您应该永远不要使用字符串操作从用户输入构建SQL查询。攻击者可以通过这种方式轻松地注入自己的SQL代码。阅读SQL客户机库的文档,查找准备好的语句和参数绑定,并在SQL查询中的任何地方使用此用户输入作为参数


还有一个提示:如果您发现自己编写的代码

sprintf("%s", "foobar");

e、 例如,您为
%s
转换提供了一个常量字符串,这是错误的。只需将常量字符串作为格式字符串的一部分。

您是否简单地尝试了
if(mysql\u query(con,sqlbuff))
?C中的数组很容易衰变为指针,根本不费吹灰之力。顺便说一句,要小心。字符数组自然会衰减为指向其第一个元素的指针。也就是说,使用普通的
sqlbuff
&sqlbuff[0]
相同,类型为
char*
。指向某物的指针可以隐式地用作指向
const
某物的指针。也就是说,当需要
const char*
时,可以使用
char*
。最后,
&sqlbuff
的类型是
char(*)[4096]
,几乎不需要这样的数组指针。是的,我最初尝试过。当我这样做时,我会得到一个“内存故障(coredump)”。我在HP-UX上运行此命令,如果这是一个因素,我会将其添加到OP.Idk中。@user3813942请不要更改您已经得到答案的部分代码,我回滚了该更改,因为它会使答案无效。关于你的“内存故障”,这很可能与使用的操作系统无关,也不在你展示的代码中。什么是
idVar
?它可能是
%s
的错误类型,或者您的缓冲区可能溢出。。。。从代码片段中不可能看出,顺便说一句,您本可以避免这种情况,因为您知道。你真正的问题是你的程序崩溃了。您认为这与
const char*
有关(事实并非如此),但您不是询问您的实际问题,而是询问您认为解决方案是什么。好吧,如果你没有发现问题,只需问一个新问题并包含一个:)我不知道是HP-UX还是MySQL连接器,但我在尝试时遇到了一个错误。“内存故障(coredump)”就是它所说的全部。听起来这似乎是一个独特的问题,正如您的答案所解释的,const char*应该满足于只传递我的char[]变量。@user3813942当您的程序崩溃时,认为环境/操作系统有问题是一个非常糟糕的想法。在99.999%的情况下,这是您的程序的错误。@user3813942,您所描述的这种错误是由错误的数据或数据的不正确使用引起的。溢出数组的边界是一种可能性。在指针指向的对象的生命周期结束后使用指针是另一回事。但这将是另一个问题的主题。@user3813942:idVar的类型是什么?如果它是一个整数,那么这可以解释崩溃的原因-您需要使用