复制字符串时的Segfault

时间:2012-06-14 08:40:17

标签: c string struct char

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

#include <string.h>

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

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

但是,当我尝试运行它时,它会生成分段错误。 怎么了?

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

但是,在你的情况下,它很简单:

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

您尚未为uu->username分配内存,这意味着u可以指向内存中的任何位置,u->username也是如此。

答案 2 :(得分:0)

两件事

您尚未分配结构变量“struct user * u;”

并且还没有为structore

中的* 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);
}  

如果有任何语法错误,请忽略

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

与此同时,您还应该了解内存布局,并尝试推理生活在哪里。 这个的起点是 - Stanford Pointers pdf 我建议,当你学习并卡住时,尝试在纸上绘制流程,内存访问,然后进入调试器。当我第一次学习C时,我没有这样做 - 记忆可视化是一种让人变得更好的程序员/调试者的特质 - 从我从同事那里学到的东西/在线阅读几篇文章。