2013-04-13 84 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個字符的名稱。

這段代碼的最大的問題是使用了工會,而不是一個結構。工會像結構一樣工作,但每個領域的記憶都保存在同一個地點。出於這個原因,你應該只設置其中一個字段。