2015-09-25 62 views
0

下面哪個是使用C字符串的最佳實踐?C - 字符串的最佳實踐

char full_name[] = "foo boo"; 
char * full_name = "foo boo"; 

從安全的角度來看,他們每個人的優點和缺點是什麼?

+3

你尋找他們SO? – ameyCU

+1

http://stackoverflow.com/q/1704407/3049655 –

+0

請注意問題是不同的。我不是在問幕後發生了什麼,我清楚地問使用什麼更安全。 –

回答

4

使用字符串是一項複雜的任務,您所展示的任何選項都沒有任何優點或缺點。這實際上取決於你想要實現的解決方案。

char full_name[] = "foo boo"; 

與以下內容

{'f', 'o', 'o', ' ', 'b', 'o', 'o', '\0'} 

你可以修改它,但它不能生長的數組,

char *full_name = "foo boo"; 

是一個字符串文字,你不能修改,也無法成長最好這樣定義它

const char *full_name = "foo boo"; 

儘管這並不能完全防止修改它,但它有助於避免意外操作。

修改字符串文字是可能的,它只是錯誤的,因爲它調用undefined behavior

+1

'char * full_name =「foo boo」;'將文字賦值給變量(用文字初始化變量)。您不能更改文字字符串,但是您可以爲該變量指定另一個文字或變量,例如'full_name = my_name;'。 –

+0

@PaulOgilvie嚴格地說,你可以改變它,它只是*未定義的行爲*。 –

+0

我的意思是因爲'char * full_name;'是一個指針變量,所以可以爲它分配不同的(其他)變量。這些可以是文字,也可以是包含例如字符串的「malloc」緩衝區。從文件中讀取。這不是UB。 –

-2

如果您看到安全角度,請不要使用指針。嘗試始終使用非指針變量。指針直接訪問內存地址,這可能導致內存泄漏問題,內存破解問題等。

+8

指針是C的重要組成部分,對於任何非平凡的程序都是必需的。學會正確使用它們(學習const正確性,擁有明確的所有權等)要比歇斯底里地避免它們更好。 – user694733

+0

如果您不想使用指針,請使用其他編程語言。此外,上述兩個選項中的任何一個都使用指針,您是否建議一種使用[tag:c]中不涉及指針的字符串的方法? –

+0

這是一個有趣的視角,我無法理解你將如何處理它?你是否真的在C/C++/Objective C中實現了系統而不使用指針? – wmorrison365

3

C中,字符串可以使用character pointercharacter array來引用。

字符串作爲字符數組

char str[4] = "GfG"; /*One extra for string terminator*/ 
/* OR */ 
char str[4] = {‘G’, ‘f’, ‘G’, '\0'}; /* '\0' is string terminator */ 

當字符串被聲明爲字符數組,它們被存儲在像C.其它類型的陣列。例如,如果str[]auto variable然後字符串存儲在stack segment ,如果它是一個globalstatic變量然後存儲在data segment等使用字符指針

字符串

使用character pointer字符串可以存儲在兩個方面:

  1. 在一個共享網段的只讀字符串。

    當字符串值被直接賦值給一個指針時,在大多數編譯器中,它存儲在一個只讀函數中的只讀塊(通常在data segment)。

    char *str = "GfG"; 
    

    在上述線「GfG」被存儲在共享的只讀位置,但指針str被存儲在讀 - 寫存儲器。您可以將str更改爲點其他值,但目前str無法更改值。所以這種類型的字符串應該只在我們不想在程序的後續階段修改字符串時使用。

  2. 動態分配在heap segment

    字符串像其他動態分配的東西一樣存儲在C中,並且可以在功能之間共享。

    char *str; 
    int size = 4; /*one extra for ‘\0’*/ 
    str = malloc(size); 
    *(str+0) = 'G'; 
    *(str+1) = 'f'; 
    *(str+2) = 'G'; 
    *(str+3) = '\0'; 
    

For more details