C 如何为查询字符串正确分配内存?
我需要在C程序中执行sql查询。我使用libpq连接到PostgresqlC 如何为查询字符串正确分配内存?,c,postgresql,malloc,C,Postgresql,Malloc,我需要在C程序中执行sql查询。我使用libpq连接到Postgresql char *formatted_query = "SELECT * FROM table LIMIT %d OFFSET %d"; char *query; PGconn *conn; PGresult *res; int limit; int offset; /* here is connect to base get some data from user (like limit, offset etc.) */ s
char *formatted_query = "SELECT * FROM table LIMIT %d OFFSET %d";
char *query;
PGconn *conn;
PGresult *res;
int limit;
int offset;
/* here is connect to base get some data from user (like limit, offset etc.) */
sprintf(query, formatted_query, limit, offset);
res = PQexec(conn, query);
问题是我不知道如何为query
我当然可以这样做:
char query[999];
但我认为这种方式是错误的。如果我这样做了:
char *query = (char *)malloc(sizeof(char) * sizeof(formatted_query));
可能会出现分配的内存不足的情况(例如,限制或偏移量将为MAX_INT)。
如何为查询字符串正确分配内存?您可以计算两个数字将包含多少个符号,但最简单的方法是:
// max 32 bit unsigned integer number is 4294967295 (10 symbols)
int maxPossibleStringLength = strlen(formatted_query) + 2*10 + 1; // don't forget 0 symbol at end
char *query = (char *)malloc(sizeof(char) * maxPossibleStringLength);
您应该真正使用
PQexecParams
。不幸的是,对于整数,您仍然必须将其格式化为文本,但您可以使用一个简单的静态缓冲区
PGconn *conn;
PGresult *res;
#define MAX_INT4_DIGITS 11
const char *query = "SELECT * FROM table LIMIT $1 OFFSET $2";
Oid paramtypes[] = {INT4OID, INT4OID};
char *paramvalues[2];
char limitstr[MAX_INT4_DIGITS];
char offsetstr[MAX_INT4_DIGITS];
snprintf(offsetstr, MAX_INT4_DIGITS, "%d", limit);
snprintf(limitstr, MAX_INT4_DIGITS, "%d", offset);
paramvalues[0] = limitstr;
paramvalues[1] = offsetstr;
res = PQexecParams(conn, query, 2, paramtypes, paramvalues, NULL, NULL, 0);
当您只有两个整数参数时,使用参数化查询并没有什么大不了的,但是当您使用用户提供的字符串时,它就变得至关重要了。否则,引用和转义SQL注入将使您陷入可怕的困境
libpq二进制协议接口实际上要方便得多,但不幸的是,它不能跨不同的体系结构(endianness、字大小等)工作
要获得一个更方便的界面,自动处理一些低级的libpq,请看。
char*query=malloc(snprintf(NULL,0,格式化的查询,限制,偏移量)+1)代码>呃,哎呀。相当地固定的。