Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何为查询字符串正确分配内存?_C_Postgresql_Malloc - Fatal编程技术网

C 如何为查询字符串正确分配内存?

C 如何为查询字符串正确分配内存?,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

我需要在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.) */
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)呃,哎呀。相当地固定的。