Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 复制字符串时出错_C_String_Struct_Char - Fatal编程技术网

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()

我试着学习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()
{
字符用户名[]=“根”;
结构用户*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
。查看