2013-04-13 63 views
1

发现此示例代码来自在线练习测试,如何声明 strcpy(e1.name, "K");有效,但声明e1.age=10;是不是?任何原因。请澄清。如何使用strcpy将值存储在常量变量中?

海合会观察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; 
} 
+3

我想,你的'union'真的应该是一个'struct'。 –

+3

GCC和叮当喂这段代码时都会抱怨。你也错过了一个包含。 – Mat

+0

@ExP我已经说,从实践的检验。不是我的 – Neeraj

回答

1

当您访问age,编译器知道是e1const但禁止写。

当在另一方面,你叫strcpy,指针被传递到在一个(标准 - )库实现的功能。由于它只是一个内存地址,因此该库只会执行其写入操作。

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

1

要回答你的第一个问题,strcpy的在名称字段通过char数组和字符串字面字符迭代,节省每一个副本存储名字。当到达源字符串的末尾时,应该找到空字符并将其复制到目标。空字符指示字符串的结尾,并且它被复制非常重要。如果不是这样,你的程序可能会读取数组的末尾,导致段错误或暴露缓冲区溢出攻击。在你的情况下,由于名称数组的长度为15,所以不应复制超过14个字符的名称。

这段代码的最大的问题是使用了工会,而不是一个结构。工会像结构一样工作,但每个领域的记忆都保存在同一个地点。出于这个原因,你应该只设置其中一个字段。