我正在尝试学习 C,现在我正在玩结构。我有以下代码:
#include <string.h>
struct user {
unsigned int utime;
char *username;
};
void main()
{
char username[] = "root";
struct user *u;
strcpy(u->username, username);
}
但是,当我尝试运行它时,它会产生分段错误。它出什么问题了?
u
是一个指向结构的指针,但您还没有为它分配任何内存。该行必须是
struct user *u = malloc(sizeof(struct user))
. 此外,您还必须username
在调用之前为结构中的指针分配内存strcpy
。
遇到崩溃(如分段错误)时,您应该做的第一件事是在调试器中运行您的程序。它将帮助您确定崩溃的位置,还可以让您检查变量以查看可能导致崩溃的原因。
但是,在您的情况下,它非常简单:
struct user *u;
strcpy(u->username, username);
您还没有为u
or分配内存u->username
,这意味着它u
可以指向内存中的任何位置,对于u->username
.
两件事情
您还没有为结构变量“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);
}
如有语法错误请忽略
另一种方法是使用 u 作为一个简单的变量struct user u
:然后使用“.”访问 utime 或用户名,如下所示:
u.utime = ...;
u.username = ...;
同时,您还应该了解内存布局,并尝试推理什么存在于何处。一个起点是 - Stanford Pointers pdf 我建议,当你在学习并陷入困境时,尝试在纸上绘制流程、内存访问,然后进入调试器。当我第一次学习 C 时,我没有这样做——内存可视化是一种似乎使一个人成为更好的程序员/调试器的特性——从我从同事那里学到的东西/阅读了几篇在线文章。