2012-11-07 60 views
0

可能重複:
Why do I get a segmentation fault when writing to a string?分配值指針拋出異常

我是新來的C/C++,我想了解它,我已經創建了下面的功能,但它會拋出一個異常,當我試圖將大寫值賦給*字符串時:CPP1.exe中的0x00411820處未處理的異常:0xC0000005:訪問衝突寫入位置0x00417754。

void ToUpper(char* string) 
{ 
    while(*string != '\0') 
    { 
     if(*string >= 97 && *string <= 122) 
     { 
      int symbol = *string; 
      *string = symbol - 32; 
     } 
     string++; 
    } 
} 

用法:

char* x = "text"; 
ToUpper(x); 

你能幫幫我嗎?

+10

讓我猜猜,你傳遞一個字符串。向我們展示'main'功能。 – avakar

+0

請顯示此功能的用法 – giorashc

+0

是的,我正在嘗試以下事情:char * x =「text」; ToUpper的(X); – Eugene

回答

3

變化

char* x = "text"; 

char x[] = "text"; 

DONE

+0

太棒了,它可以工作,但是請你解釋爲什麼x []工作和char * []沒有,或者指向我可以找到它的某些資源? – Eugene

+1

閱讀此鏈接:http://msdn.microsoft.com/en-us/library/69ze775t(v=vs.80).aspx – billz

+0

字符串文字位於只讀位置,無法修改... – billz

2

從不嘗試更改常量字符串。總是使用字符數組進行這種操作。

+0

它相當「從來沒有_try_改變......「;) – SingerOfTheFall

+0

或'malloc','calloc'。如果它是C++更好,'std :: string' –

-1

您必須在賦值語句中鍵入轉換值。

* string = *(char *)symbol - 32;

+0

沒有解決問題 – Eugene

+0

它沒有解決任何問題,但它增加了另一個主要錯誤,導致程序崩潰更加困難。 – Lundin

0

您可以使用這樣無需創建symbol varible

*string=*string-32; 

但通過array在調用環境中的功能,而通過​​

所以

「文本」
char * str[] ="hello"; 
ToUpper(str); 
1

內存將在.readonly部分進行分配。

char* x = "text"; 

Tyring以改變只讀部分是未定義的行爲。使用gcc -S filename.c來查看彙編代碼。這給你更多關於「文本」的去向的想法。

與其他人一樣,我建議使用char x[] = "text"代替。

1
main() 
{ 
    char *a = "text"; 
    char *x = malloc(strlen(a)+1); 
    strcpy(x,a); 
    ToUpper(x); 
    // ToUpper(a); // Fails 
    printf("%s %s\n",a,x); 
} 

輸出:text TEXT

ToUpper的(a)中失敗,因爲字符串替換在受保護的存儲器區域(在代碼的中間最有可能的,如至少64位x86處理器具有[rip] - 相對尋址模式,這使得將數據放置在代碼行之間有利可圖。

此外char x[]="text";作品,因爲現在x的完整陣列放置在棧中。在char *x = "text";的情況下,只能將指針放在堆棧上,但內容指向受限制(只讀)的內存。

+0

由於字符串長度在編譯時已知,使用malloc絕對沒有意義。如果你這樣做,請致電免費()。 – Lundin

1

這是試圖通過指針修改字符串文字的錯誤:

void f() 
{ 
    char * p = "Naee"; 
    p[2] = 'm'; // error: assignment to const; result is undefined 
} 

有字符串字面常量允許在存儲分配和訪問顯著優化。如果你想,你可以修改 修改字符串,必須將字符複製到一個數組:

void f() 
{ 
    char p [] = "Eero"; 
    p [0] = 'Z'; // ok 
}