为以下代码获取分段错误。请指教。
struct columns {
char* c_name;
char* c_type;
char* c_size;
};
int main(int argc, char* argv[])
{
int column_num = 3;
struct columns col[10];
//columns *col = (columns*) malloc (sizeof(columns) * column_num);
strcpy(col[0].c_name, "PSID");
strcpy(col[0].c_type, "INT");
strcpy(col[0].c_size, "4");
}
我使用2种方法为列结构分配空间,但继续得到分段错误。我错过了什么吗?
答案 0 :(得分:5)
结构中的所有指针都没有实际初始化为任何东西。你必须给它们一个维度,或为它们动态分配一些内存。
答案 1 :(得分:2)
col[0].c_name
是一个指针,但不指向任何内存。这就是为什么它会出现段错误。
在复制任何内容之前,使用数组char c_name[256];
或malloc()
分配一些内存。
答案 2 :(得分:2)
试试这个(strdup
处理存储,但记得在完成后自由):
struct columns {
char* c_name;
char* c_type;
char* c_size;
};
int main(int argc, char* argv[])
{
int column_num = 3;
struct columns col[10];
col[0].c_name = strdup("PSID");
col[0].c_type = strdup("INT");
col[0].c_size = strdup("4");
return 0;
}
答案 3 :(得分:1)
您永远不会分配内存并初始化char*
指针。
像
strcpy(col[0].c_name=malloc(sizeof "PSID"),"PSID");
当然,您需要检查错误并使其有意义。
答案 4 :(得分:1)
您为columns
结构分配空间,但不为您要存储的字符串分配空间。您的指针(即c_name
)未初始化,指向一些随机内存位置,因此您可以立即调用未定义的行为。