2014-01-15 138 views
1

我做了一個函數,它改變了字符串,參見下面的代碼。傳遞字符串文字作爲char *通過參數

void Test(char* str, char c) { 
    str[1] = c; 
} 

int main(){ 
    Test("Hi", '2'); 
} 

我注意到它做了一些運行時錯誤。我知道如何防止錯誤。

char buff[3] = "Hi"; 
Test(buff,'2'); 

但我不知道爲什麼第一個示例運行時錯誤。我猜,如果我直接傳遞字符串,它會變成const char。有人解釋究竟發生了什麼嗎?

ps。 如果我使用char * str =「hi」,然後將它傳遞給參數?

char* buff = "Hi"; 
Test(buff,'2'); 

這樣子。我可以修改愛好者嗎?

+0

閱讀一些有關'爲const char *'。 –

+0

這不再是合法的C++(因爲不應該編譯)並且從來沒有錯。 – chris

+0

最後一個是新的,我認爲它應該是'char * buff',但仍然沒有。無論你如何解決這個問題,使用指向非常量數據的指針指向常量數據將永遠不會工作。 – chris

回答

0

通常字符串常量位於只讀內存中,當您嘗試修改它時會導致運行時錯誤。

在第二個示例中,將字符串放入堆棧的緩衝區中,以便可以更新而不會出錯。

2

由於"Hi"字符串文字並且它不允許進行修改,它們是隻讀的(字符串文字的類型是const char[n])。

修改它是未定義的行爲


關於您的編輯:char* str = "hi"是無效的,應該是const char* str = "hi"。這是指向const char的指針。再次,修改它是不允許的。

+0

如果他聲明瞭'char * buff =「Hi」'(這會將'buff'放在只讀代碼段而不是堆棧中),則爲真。 –

+0

@barakmanos - 呃,什麼? –

+0

@barak OP * *(隱含地)聲明它。這個答案是正確的。 –

0

字符串不可修改。當我用GCC編譯代碼我得到警告:

testptr.cpp:6: warning: deprecated conversion from string constant to 'char*' 
0

運行時錯誤:

char* buff = "Hi"; // buff points to an address in the code-section, which is a Read-Only section 
buff[1] = 'x';  // Illegal memory access violation 

編譯錯誤:

const char* buff = "Hi"; // This is a correct declaration, which will prevent the runtime error above 
buff[1] = 'x';   // The compiler will not allow this 

都好:

char buff[] = "Hi"; // buff points to an address in the stack or the data-section, which are both Read-Write sections 
buff[1] = 'x';  // Works OK 

注:

  1. 在所有情況下,字符串「喜」被放置在程序的代碼段。

  2. 在上例中,該字符串的內容被複制到buff數組中。

  3. 在最後一個例子中,buff陣列位於所述堆疊中如果buff是一個非靜態本地變量,並在程序的數據段否則。

+0

非常感謝。 :) – Sehui

0

當您不爲字符串顯式分配內存時,編譯器會將它們存儲在只讀內存中。所以,對這些字符串的任何修改都會導致運行時錯誤。

Test("Hi", '2'); 

這裏在上述情況下,「Hi」字符串存儲在只讀存儲器中。

char *buff = "Hi"; 
Test(buff,'2'); 

在這裏也是「您好」被存儲在只讀存儲器和所述起始地址被返回給拋光輪字符指針,這是與上述相同。您可以通過爲字符串分配內存來克服此類錯誤,然後傳遞該引用。像

char buff[3] = "Hi"; 
Test(buff,'2'); 

char *buff = (char *)malloc(SIZE); 
strcpy(buff, "Hi"); 
Test(buff,'2'); 

請參考此鏈接http://www.geeksforgeeks.org/memory-layout-of-c-program/

相關問題