strcpy如何用于在常量变量中存储值?

时间:2013-04-13 16:57:05

标签: c data-structures struct unions

在线练习测试发现了这个示例代码,声明如何 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;
}

2 个答案:

答案 0 :(得分:1)

当您访问age时,编译器知道e1const并禁止写入。

另一方面,当您调用strcpy时,指针将传递给在(标准)库中实现的函数。由于它只是一个内存地址,因此该库只执行其写操作。

这不应该被允许,因为指针实际上是const对象的内存地址。编译器会告诉您这不允许,但只会产生警告。严格来说,这个警告应该是一个错误。

答案 1 :(得分:1)

要回答你的第一个问题,strcpy通过遍历char数组以及字符串文字的字符来存储名称字段中的给定名称,并保存每个字符的副本。到达源字符串的末尾时,应找到null char并将其复制到目标。 null char表示字符串的结尾,复制它是非常重要的。如果不是,您的程序可能会读取数组的末尾,导致段错误或使您暴露于缓冲区溢出攻击。在您的情况下,由于名称数组的长度为15,因此不应复制超过14个字符的名称。

此代码的最大问题是使用union而不是struct。联合使用结构,但每个字段的内存保存在同一位置。因此,您只应设置其中一个字段。