Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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
使用strcpy()为结构赋值。程序不运行_C_Arrays_Struct - Fatal编程技术网

使用strcpy()为结构赋值。程序不运行

使用strcpy()为结构赋值。程序不运行,c,arrays,struct,C,Arrays,Struct,我是c新手,我尝试使用strcpy将值赋值给结构(我尝试使用左值赋值方法,这会引发错误)。我试着运行程序,但什么也没发生。我的代码中的错误在哪里? 我用代码块来运行程序 #include <stdio.h> #include <stdlib.h> int main(){ struct student{ char name[25]; int age; }; struct student s1; strcpy(

我是c新手,我尝试使用strcpy将值赋值给结构(我尝试使用左值赋值方法,这会引发错误)。我试着运行程序,但什么也没发生。我的代码中的错误在哪里? 我用代码块来运行程序

#include <stdio.h>
#include <stdlib.h>

int main(){
    struct student{
        char name[25];
        int age;
    };
    struct student s1;
    strcpy(s1.name, "Sammy");
    strcpy(s1.age, "18");
    printf("%s, %d", s1.name, s1.age);
}
#包括
#包括
int main(){
结构学生{
字符名[25];
智力年龄;
};
结构学生s1;
strcpy(s1.name,“Sammy”);
strcpy(s1.18岁);
printf(“%s,%d”,s1.name,s1.age);
}

删除此项:

strcpy(s1.age, "18");
你可以选择正常作业<代码>s1。年龄=18岁

用于将字符串复制到字符缓冲区。有
strcpy(s1.18岁)
,您正试图从字符串
18
的地址读取一些内容,然后写入
s1.age
,这是一个
int


age
成员声明为
char
数组,就像对
name
所做的那样(尽管这会限制您对
age
执行算术运算)。或者,使用赋值运算符
=
分配
int
。比如:
s1.age=18

要做的第一件事是从编译器中读取警告,因为它们包含有关代码问题的有价值信息。使用gcc和clang编译原始代码时会出现以下警告:

叮当声:

so5.c:12:12:警告:不兼容的整数到指针转换将“int”传递给“char*”类型的参数[-Wint conversion]

通用条款:

so5.c:12:12:警告:传递'strcpy'的参数1将从整数生成指针,而不进行强制转换[-Wint转换] strcpy(s1.18岁)

因此,令人不快的是:

strcpy(s1.age, "18");
首先将未初始化的s1.age视为指针,并尝试将字符串复制到此未知位置。这很可能会导致分离故障

当然,您可以为它创建一个指针,并用
“18”

但请稍候,这样会产生如下打印结果:

萨米,14385

因为字符串是用ascii编码的,所以有三个字节
0x31,0x38,0

当以
0x003831
或十进制
14385
写入
int age
字段的位置时。然而,铰孔字节被随机初始化为0,这纯粹是运气

分配年龄值的正确方法是分配:

s1.age = 18;

s1.age
是一个
int
,而不是一个字符串。不能使用strcpy
strcpy
对其进行分配。尝试
s1.age=18@Nate Eldredge是的,现在它似乎正在工作。感谢您的支持,还有#include一些编译器可能需要它1.age=18它不是一个字符串,但如果您没有收到strcpy(s1.age,“18”)的错误消息然后调整您的编译器设置--您在这里浪费了大量时间,而利用编译器的诊断功能本可以节省这些时间是的,我已经改变了这一点,现在它可以工作了。谢谢你的帮助。另外,请拆下integer@TruthSeeker之前是&s…现在是问题编辑
s1.age = 18;