使用strcpy时重复出现分段错误

recurring segmentation fault while using strcpy

本文关键字:分段 错误 strcpy 使用      更新时间:2023-10-16

获取以下代码的分段错误。请告知。

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");
}

我使用两种方法为列结构分配空间,但仍然存在分段错误。我是不是错过了什么?

结构中的任何指针实际上都没有初始化为任何内容。你必须给它们一个维度,或者动态地为它们分配一些内存。

试试这个(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;
}

col[0].c_name是一个指针,但不指向任何内存。这就是为什么它会断开。

在复制其中的任何内容之前,请使用数组char c_name[256];malloc()分配一些内存。

您从不分配内存和初始化char*指针。

strcpy(col[0].c_name=malloc(sizeof "PSID"),"PSID");

当然,您需要检查错误,并使其在其他方面有意义。

您为columns结构分配空间,但不为要存储的字符串分配空间。您的指针(即c_name)未初始化,指向一些随机内存位置,因此您可以立即调用未定义的行为。