C 复制字符串时出错
我试着学习C,现在我在玩结构。 我有以下代码:C 复制字符串时出错,c,string,struct,char,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); } #包括 结构用户{ 无符号整数时间; 字符*用户名; }; void main()
#include <string.h>
struct user {
unsigned int utime;
char *username;
};
void main()
{
char username[] = "root";
struct user *u;
strcpy(u->username, username);
}
#包括
结构用户{
无符号整数时间;
字符*用户名;
};
void main()
{
字符用户名[]=“根”;
结构用户*u;
strcpy(u->用户名,用户名);
}
但是,当我尝试运行它时,它会生成一个分段错误。
有什么问题吗?
u
是指向结构的指针,但您尚未为其分配任何内存。线路必须是
struct user*u=malloc(sizeof(struct user))
。此外,在调用strcpy之前,您还必须为结构中的用户名指针分配内存u
是指向结构的指针,但您尚未为其分配任何内存。线路必须是
struct user*u=malloc(sizeof(struct user))
。此外,在调用strcpy之前,还必须为结构中的用户名
指针分配内存。发生崩溃(如分段错误)时,首先要做的是在调试器中运行程序。它将帮助您精确定位崩溃的位置,还可以让您检查变量以查看可能导致崩溃的原因
但是,在您的情况下,它非常简单:
struct user *u;
strcpy(u->username, username);
您没有为u
或u->username
分配内存,这意味着u
可以指向内存中的任何位置,对于u->username也一样,当发生崩溃(如分段错误)时,您应该做的第一件事是在调试器中运行程序。它将帮助您精确定位崩溃的位置,还可以让您检查变量以查看可能导致崩溃的原因
但是,在您的情况下,它非常简单:
struct user *u;
strcpy(u->username, username);
您没有为u
或u->username
分配内存,这意味着u
可以指向内存中的任何位置,而u->username
也可以指向这两件事
您尚未为结构变量“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);
}
#包括
结构用户{
无符号整数时间;
字符*用户名;
};
void main()
{
字符用户名[]=“根”;
结构用户*u=malloc(sizeof(结构用户));
u->username=malloc(strlen(username)+1);
strcpy(u->用户名,用户名);
}
如果它有任何语法错误,请忽略两件事
您尚未为结构变量“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);
}
#包括
结构用户{
无符号整数时间;
字符*用户名;
};
void main()
{
字符用户名[]=“根”;
结构用户*u=malloc(sizeof(结构用户));
u->username=malloc(strlen(username)+1);
strcpy(u->用户名,用户名);
}
如果它有任何语法错误,请忽略它。另一种方法是使用u作为简单变量:struct user u
;然后使用“.”访问utime或用户名,如下所示:
u.utime = ...;
u.username = ...;
另一种方法是使用u作为简单变量:struct user u
;然后使用“.”访问utime或用户名,如下所示:
u.utime = ...;
u.username = ...;
同时,您还应该了解内存布局,并尝试推理哪些内存在哪里。
这样做的起点是-
我建议,当你在学习和陷入困境时,试着在纸上绘制流程、内存访问,然后进入调试器。当我第一次学习C语言时,我并没有这样做——内存可视化是一种让人成为更好的程序员/调试器的特质——从我从同事那里学到的知识/在线阅读了几篇文章。同时,你也应该了解内存布局,并尝试推理内存所在的位置。
这样做的起点是-
我建议,当你在学习和陷入困境时,试着在纸上绘制流程、内存访问,然后进入调试器。当我第一次学习C时,我没有这样做——内存可视化是一种让人成为更好的程序员/调试器的特征——从我从同事那里学到的东西/在线阅读了几篇文章。或者只是使用堆栈分配的struct user
(但是用户名的内存仍然需要动态分配)。或者只需使用堆栈分配的struct user
(但动态分配仍需要username
的内存)。在纯C中,malloc
的返回值不必进行类型转换。@LihO我想我们应该这样做,因为malloc返回类型是void*。可能您在为字符串分配内存时会收到警告,它应该是strlen(username)+1
,因此您也可以为终止的'\0'
获得空间。或者使用strdup
而不是malloc
和strcpy
。看看纯C,malloc
的返回值不必进行类型转换。@LihO我想我们应该这样做,因为malloc返回类型是void*。可能您在为字符串分配内存时会收到警告,它应该是strlen(username)+1
,因此您也可以为终止的'\0'
获得空间。或者使用strdup
而不是malloc
和strcpy
。查看