列号 1 超出范围 0..-1
column number 1 is out of range 0..-1
我写了一个函数,我想在其中传递一个指向结构数组的指针。我在里面做 new()
并且我想用从 PGresult 结构 (res) 检索到的数据填充它。但是我得到了错误:
column number 0 is out of range 0..-1
column number 1 is out of range 0..-1
column number 2 is out of range 0..-1
column number 3 is out of range 0..-1
Segmentation fault (core dumped)
这是我的函数
Database::selectAnnouncements(const int user_id, const char *cat_id, struct announcementStruct **pStruct, int *size) {
*size = PQntuples(res);
struct announcementStruct * ann = new struct announcementStruct[PQntuples(res)];
*pStruct = ann;
int cr_fnum = PQfnumber(res, "created_on");
int con_fnum = PQfnumber(res, "content");
int cat_fnum = PQfnumber(res, "category");
int rm_fnum = PQfnumber(res, "remove_on");
for (int i = 0; i < PQntuples(res); i++) {
const char *cr_val = PQgetvalue(res, i, cr_fnum);
const char *con_val = PQgetvalue(res, i, con_fnum);
const char *cat_val = PQgetvalue(res, i, cat_fnum);
const char *rm_val = PQgetvalue(res, i, rm_fnum);
(*pStruct[i]).creation_date = new char[strlen(cr_val)];
(*pStruct[i]).content = new char[strlen(con_val)];
(*pStruct[i]).category = new char[strlen(cat_val)];
(*pStruct[i]).removal_date = new char[strlen(rm_val)];
strcpy((*pStruct[i]).creation_date, cr_val);
strcpy((*pStruct[i]).content, con_val);
strcpy((*pStruct[i]).category, cat_val);
strcpy((*pStruct[i]).removal_date, rm_val);
}
for (int i = 0; i < PQntuples(res); i++) {
printf("%s ", (pStruct[i]->creation_date));
printf(" %s ", (pStruct[i]->content));
printf(" %s ", (pStruct[i]->category));
printf(" %s ", (pStruct[i]->removal_date));
printf("\n");
}
PQclear(res);
}
下面是我的使用方法
struct announcementStruct *announcements = NULL;
int size;
db.selectAnnouncements(0, "DOGS", &announcements, &size);
您肯定忘记了以 null 终止字符串。分配 strlen + 1 以适应空值。忘记 null 是导致段错误的一个简单原因。像 strncpy snprintf 这样的函数有助于确保事情更安全。
凯文的评论也是正确的。确保你得到了这个错误的所有 12 个实例(原来的 4 个,strcpy 中的 4 个和 printf 中的 4 个)
我写了一个函数,我想在其中传递一个指向结构数组的指针。我在里面做 new()
并且我想用从 PGresult 结构 (res) 检索到的数据填充它。但是我得到了错误:
column number 0 is out of range 0..-1
column number 1 is out of range 0..-1
column number 2 is out of range 0..-1
column number 3 is out of range 0..-1
Segmentation fault (core dumped)
这是我的函数
Database::selectAnnouncements(const int user_id, const char *cat_id, struct announcementStruct **pStruct, int *size) {
*size = PQntuples(res);
struct announcementStruct * ann = new struct announcementStruct[PQntuples(res)];
*pStruct = ann;
int cr_fnum = PQfnumber(res, "created_on");
int con_fnum = PQfnumber(res, "content");
int cat_fnum = PQfnumber(res, "category");
int rm_fnum = PQfnumber(res, "remove_on");
for (int i = 0; i < PQntuples(res); i++) {
const char *cr_val = PQgetvalue(res, i, cr_fnum);
const char *con_val = PQgetvalue(res, i, con_fnum);
const char *cat_val = PQgetvalue(res, i, cat_fnum);
const char *rm_val = PQgetvalue(res, i, rm_fnum);
(*pStruct[i]).creation_date = new char[strlen(cr_val)];
(*pStruct[i]).content = new char[strlen(con_val)];
(*pStruct[i]).category = new char[strlen(cat_val)];
(*pStruct[i]).removal_date = new char[strlen(rm_val)];
strcpy((*pStruct[i]).creation_date, cr_val);
strcpy((*pStruct[i]).content, con_val);
strcpy((*pStruct[i]).category, cat_val);
strcpy((*pStruct[i]).removal_date, rm_val);
}
for (int i = 0; i < PQntuples(res); i++) {
printf("%s ", (pStruct[i]->creation_date));
printf(" %s ", (pStruct[i]->content));
printf(" %s ", (pStruct[i]->category));
printf(" %s ", (pStruct[i]->removal_date));
printf("\n");
}
PQclear(res);
}
下面是我的使用方法
struct announcementStruct *announcements = NULL;
int size;
db.selectAnnouncements(0, "DOGS", &announcements, &size);
您肯定忘记了以 null 终止字符串。分配 strlen + 1 以适应空值。忘记 null 是导致段错误的一个简单原因。像 strncpy snprintf 这样的函数有助于确保事情更安全。
凯文的评论也是正确的。确保你得到了这个错误的所有 12 个实例(原来的 4 个,strcpy 中的 4 个和 printf 中的 4 个)