【问题标题】:Segfault while copying string复制字符串时出现段错误
【发布时间】:2012-06-17 06:37:21
【问题描述】:

我正在努力学习 C,现在我正在玩结构。 我有以下代码:

#include <string.h>

struct user {
  unsigned int utime;
  char *username;
};

void main()
{
  char username[] = "root";
  struct user *u;
  strcpy(u->username, username);
}

但是,当我尝试运行它时,它会产生分段错误。 它有什么问题?

【问题讨论】:

    标签: c string struct char


    【解决方案1】:

    u 是一个指向结构的指针,但您还没有为它分配任何内存。该行必须是 struct user *u = malloc(sizeof(struct user))。此外,在调用 strcpy 之前,您还必须为结构中的 username 指针分配内存。

    【讨论】:

    • 或者只使用分配给struct user的堆栈(但动态分配仍需要username的内存)。
    【解决方案2】:

    遇到崩溃(如分段错误)时,您应该做的第一件事是在调试器中运行您的程序。它将帮助您查明崩溃的位置,还可以让您检查变量以了解可能导致崩溃的原因。

    但是,在您的情况下,它非常简单:

    struct user *u;
    strcpy(u->username, username);
    

    您还没有为u 或u-&gt;username 分配内存,这意味着u 可以指向内存中的任何位置,u-&gt;username 也是如此。

    【讨论】:

      【解决方案3】:

      另一种方法是将 u 用作简单变量:struct user u;然后使用“.”访问 utime 或用户名,如下所示:

      u.utime = ...;
      u.username = ...;
      

      【讨论】:

        【解决方案4】:

        两件事

        你还没有为结构变量“struct user *u;”分配

        而且你还没有为结构中的 *username 分配内存

        上班

         #include <string.h>
         struct user {
         unsigned int utime;
         char *username;
         };
        
         void main()
         {
            char username[] = "root";
            struct user *u=malloc(sizeof(struct user));
            u->username=malloc(strlen(username)+1);
            strcpy(u->username, username);
        }  
        

        如有语法错误请忽略

        【讨论】:

        • 在纯 C 中,malloc 的返回值不必进行类型转换。
        • @LihO 我认为我们应该这样做,因为 malloc 返回类型是 void*。可能你会收到警告
        • 在为字符串分配内存时,它应该是strlen(username) + 1,所以你也有空间给终止的'\0'。或者使用strdup 代替malloc 和strcpy。
        【解决方案5】:

        同时,您还应该了解内存布局,并尝试推理什么存在于何处。 一个起点是 -Stanford Pointers pdf 我建议,当你在学习并遇到困难时,试着在纸上画出流程、内存访问,然后进入调试器。当我第一次学习 C 时,我并没有这样做 - 内存可视化是一种似乎可以让一个人成为更好的程序员/调试器的特质 - 从我从同事那里学到的东西/阅读了几篇在线文章。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-06
          • 1970-01-01
          • 2013-08-31
          • 1970-01-01
          • 2020-10-02
          • 2012-06-25
          • 2020-11-27
          • 1970-01-01
          相关资源
          最近更新 更多