0
A
回答
3
這是未定義的行爲。你不能改變文字。
有一個指針指向字面,它應該是:
const char* str = "Hello";
//^^^^^
然後,爲了能夠改變字符串,這是應該的,例如
char str[] = "Hello";
另一種選擇是分配動態存儲器(使用malloc
和free
)
1
2
字符串文字被分配在只讀存儲器中。所以基本上它們是類型的(const char *
)。它不能被改變。 另請參閱this瞭解更多信息。
0
#include <string.h>
char *str;
if((str = malloc(strlen("hello"))) != NULL)
return (null);
str = strcpy(str, "hello");
printf("%s\n", str); // should print hello
str[2] = '3';
printf("%s\n", str) // should print he3lo
的這裏的事情是我先分配內存來設置字符串中的字符。 但是,如果你不擅長分配,你可以隨時設置char str [] =「hello」;
0
str
的內存將分配在.rodata
部分。所以試圖修改只讀數據會產生問題。
以下問題出現問題。
#include <stdio.h>
int main()
{
char * str = "Hello";
printf("\n%s \n", str);
*(str+1) = '3';
printf("\n%s \n", str);
return 0;
}
對應的拆卸
.file "dfd.c"
.section .rodata
.LC0:
.string "Hello"
.LC1:
.string "\n%s \n"
.text
.....
.....
,其結果是
Hello
Segmentation fault (core dumped)
im使用上X86_64 gcc版本4.6.3(Ubuntu的/ Linaro的4.6.3-1ubuntu5)。
0
str是一個指向字符串常量的指針,並且該字符串的內存分配在只讀段中。如果你嘗試修改字符串內容,結果是不確定的。但是,與總是綁定到相同內存位置的數組名相比,您可以修改指向其他指針的指針。
相關問題
- 1. 指針算術不起作用
- 2. 指針算術
- 3. 指針算術
- 4. C++指針算術
- 5. C指針算術
- 6. 「簡單」算術
- 7. 指針通過指針不起作用
- 8. 簡單的計算不起作用
- 9. 簡單的指令不起作用
- 10. 算術指針和fstream C++
- 11. 指針算術錯誤(OpenCL)
- 12. Android NDK指針算術
- 13. C++指針算術奇怪
- 14. 指針算術問題
- 15. C++算術具有指針
- 16. 指針算術問題
- 17. 空指針算術錯誤
- 18. python ctypes指針算術
- 19. nullptr和指針算術
- 20. 結構和指針算術
- 21. 指針算術幫助
- 22. 指針算術符號
- 23. 指針算術的澄清
- 24. void *與char *指針算術
- 25. 釋放指針算術
- 26. 指針到指針的算術表現不如預期
- 27. 指針指針之類的指針之類的算術
- 28. C++指針指針指針乘法不起作用
- 29. 使用指針算術混淆
- 30. 用於數組的C指針算術
因此,編譯器發現錯誤,或者當我嘗試重寫那個內存位置時,程序崩潰了? – user1091856 2012-08-13 07:21:11
@ user1091856 - 如果編譯器已經捕獲到它,那麼會出現編譯器錯誤。如果程序崩潰,它會立即退出。但沒有必要崩潰。你不能改變這個記憶,如果你想改變它,任何事情都可能發生。這就是爲什麼它是_undefined behaviour_。 – 2012-08-13 07:23:20