2017-08-07 56 views
3

將字符串直接傳遞到函數是不好的做法嗎?將字符串直接傳遞到函數

會造成內存錯誤嗎?

func(char *x) { 
    //do stuff 
} 

func("String"); 

還是這樣做更安全?

char *s = "string"; 
func(s); 
+3

有沒有在安全性沒有差別。如果'func() - 它的返回類型是什麼 - 修改了字符串,那麼如果給出的字符串實際上是一個字符串字面值,無論它是否通過指針's'傳遞,所有地獄都將(可能)破壞。如果'func()'不修改字符串,爲什麼不聲明'void func(const char * x)'? –

+1

@Delonous這兩個電話都是錯誤的和不安全的。:) –

回答

4

它會導致內存錯誤?

它可能會如果你試圖修改這個字符串。

爲了安全起見聲明你的功能

func(const char *x) { 

但有沒有錯傳遞字符串文字的功能。否則99.99的程序寫得不好。

還是這樣做更安全?

char *s = "string"; 
func(s); 

爲您傳遞的指針相同的字符串字面

但下面的代碼是安全的,因爲你分配RW(讀/寫)內存,以適應字符串它不會改變任何東西,該文字到這個分配的空間

char s[] = "string"; 
func(s); 
2
func(char *x) { 
    //do stuff 
} 

此功能系統複製需要一個指針上一個字符串作爲輸入。該接口允許從x讀取&指向的數據。

因爲你使用的是字符串字面(在你的例子這兩種情況下),這是非法的修改,這個字符串(和大多數編譯器的內存,當然gcc組織的方式代碼/數據阻止你這樣做:SEGV)

「安全」的方式(只要寫,當你不出去串界 - 當然還是讀書 - ):

char s[] = "string"; 
func(s); 

,或者您不打算修改的內容在func,聲明指針const

func(const char *x)