0

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

#include <string.h>

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

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

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

4

5 回答 5

3

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

于 2012-06-14T08:42:58.430 回答
2

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

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

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

您还没有为uor分配内存u->username,这意味着它u可以指向内存中的任何位置,对于u->username.

于 2012-06-14T08:43:11.257 回答
0

两件事情

您还没有为结构变量“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);
}  

如有语法错误请忽略

于 2012-06-14T08:45:46.403 回答
0

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

u.utime = ...;
u.username = ...;
于 2012-06-14T08:46:29.293 回答
0

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

于 2012-06-14T12:28:25.370 回答