我在线练习测试发现了这个示例代码,声明如何
strcpy(e1.name, "K");
有效,但声明e1.age=10;
不是?有任何理由。请澄清。
将Gcc上的o/p
视为:K 0 0.000000
#include<stdio.h>
#include<stdlib.h>
struct employee
{
char name[15];
int age;
float salary;
};
const struct employee e1;
int main()
{
strcpy(e1.name, "K"); // How strcpy is being used to store values in a
// constant variable e1 .
//e1.age=10; // not valid
printf("%s %d %f", e1.name, e1.age, e1.salary);
return 0;
}
答案 0 :(得分:1)
当您访问age
时,编译器知道e1
是const
并禁止写入。
另一方面,当您调用strcpy
时,指针将传递给在(标准)库中实现的函数。由于它只是一个内存地址,因此该库只执行其写操作。
这不应该被允许,因为指针实际上是const
对象的内存地址。编译器会告诉您这不允许,但只会产生警告。严格来说,这个警告应该是一个错误。
答案 1 :(得分:1)
要回答你的第一个问题,strcpy通过遍历char数组以及字符串文字的字符来存储名称字段中的给定名称,并保存每个字符的副本。到达源字符串的末尾时,应找到null char并将其复制到目标。 null char表示字符串的结尾,复制它是非常重要的。如果不是,您的程序可能会读取数组的末尾,导致段错误或使您暴露于缓冲区溢出攻击。在您的情况下,由于名称数组的长度为15,因此不应复制超过14个字符的名称。
此代码的最大问题是使用union而不是struct。联合使用结构,但每个字段的内存保存在同一位置。因此,您只应设置其中一个字段。