我正在努力学习C,现在我正在玩结构。 我有以下代码:
#include <string.h>
struct user {
unsigned int utime;
char *username;
};
void main()
{
char username[] = "root";
struct user *u;
strcpy(u->username, username);
}
但是,当我尝试运行它时,它会生成分段错误。 怎么了?
答案 0 :(得分:3)
u
是指向结构的指针,但你还没有为它分配任何内存。这条线必须是
struct user *u = malloc(sizeof(struct user))
。此外,在调用username
之前,您还必须为结构中的strcpy
指针分配内存。
答案 1 :(得分:2)
遇到崩溃时应该做的第一件事(比如分段错误)就是在调试器中运行程序。它将帮助您查明崩溃的位置,还可以检查变量以查看可能导致崩溃的原因。
但是,在你的情况下,它很简单:
struct user *u;
strcpy(u->username, username);
您尚未为u
或u->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时,我没有这样做 - 记忆可视化是一种让人变得更好的程序员/调试者的特质 - 从我从同事那里学到的东西/在线阅读几篇文章。