【问题标题】:recurring segmentation fault while using strcpy使用 strcpy 时重复出现分段错误
【发布时间】:2012-03-30 14:29:51
【问题描述】:

获取以下代码的分段错误。请指教。

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 种方法为列结构分配空间,但仍然出现分段错误。我错过了什么吗?

【问题讨论】:

  • 这是在 SO...上被问得最多的问题...
  • C 还是 C++?这很重要,您(“惯用”)的方式在两种语言中是不同的。
  • 你的 main 需要一个 return 声明。
  • 如果您正在编写 C++,请使用 std::string

标签: c++ c segmentation-fault malloc


【解决方案1】:

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

【讨论】:

    【解决方案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】:

      col[0].c_name 是一个指针,但不指向任何内存。这就是它会出现段错误的原因。

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

      【讨论】:

        【解决方案4】:

        您永远不会分配内存并初始化您的 char* 指针。

        喜欢

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2019-05-10
            • 1970-01-01
            • 1970-01-01
            • 2018-03-17
            • 2020-04-20
            • 2020-02-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多