將字符串直接傳遞到函數是不好的做法嗎?將字符串直接傳遞到函數
會造成內存錯誤嗎?
func(char *x) {
//do stuff
}
func("String");
還是這樣做更安全?
char *s = "string";
func(s);
將字符串直接傳遞到函數是不好的做法嗎?將字符串直接傳遞到函數
會造成內存錯誤嗎?
func(char *x) {
//do stuff
}
func("String");
還是這樣做更安全?
char *s = "string";
func(s);
它會導致內存錯誤?
它可能會如果你試圖修改這個字符串。
爲了安全起見聲明你的功能
func(const char *x) {
但有沒有錯傳遞字符串文字的功能。否則99.99的程序寫得不好。
還是這樣做更安全?
char *s = "string"; func(s);
爲您傳遞的指針相同的字符串字面
但下面的代碼是安全的,因爲你分配RW(讀/寫)內存,以適應字符串它不會改變任何東西,該文字到這個分配的空間
char s[] = "string";
func(s);
func(char *x) {
//do stuff
}
此功能系統複製需要一個指針上一個字符串作爲輸入。該接口允許從x
讀取&指向的數據。
但因爲你使用的是字符串字面(在你的例子這兩種情況下),這是非法的修改,這個字符串(和大多數編譯器的內存,當然gcc
組織的方式代碼/數據阻止你這樣做:SEGV)
「安全」的方式(只要寫,當你不出去串界 - 當然還是讀書 - ):
char s[] = "string";
func(s);
,或者您不打算修改的內容在func
,聲明指針const
:
func(const char *x)
有沒有在安全性沒有差別。如果'func() - 它的返回類型是什麼 - 修改了字符串,那麼如果給出的字符串實際上是一個字符串字面值,無論它是否通過指針's'傳遞,所有地獄都將(可能)破壞。如果'func()'不修改字符串,爲什麼不聲明'void func(const char * x)'? –
@Delonous這兩個電話都是錯誤的和不安全的。:) –