#include <stdio.h>
#include <string.h>
main()
{
char tmpChar;
char *str_1 = "Hello";
int index;
int len = strlen(str_1);
for (int i = 0; i < len/2; i++)
{
index = len - 1- i;
tmpChar = str_1[len - i -1];
str_1[index] = str_1[i]; <<<<<--------------- core dumps at this point. Not sure why
str_1[i] = tmpChar;
printf("str_1[%d] = %c\n", i, str_1[i]);
}
str_1[len] = '\0';
printf("str_1 = %s\n", str_1);
}
1
A
回答
1
ISO C99標準已經這樣說的字符串(節6.4.5/6):
它是不確定是否這些陣列是獨特的,只要它們的元素具有合適的值即可。如果程序試圖修改這樣一個數組,行爲是 未定義。
這是因爲,通常情況下,所有字符串文字被集中到一個可能被標記爲只讀的區域,並且它們有時被合併以節省空間。換句話說,兩個字符串文字:
char *p1 = "Googolplex";
char *p2 = "plex";
可因此存儲:
+--- p1 p2 ---+
| |
V V
+---+---+---+---+---+---+---+---+---+---+----+
| G | o | o | g | o | l | p | l | e | x | \0 |
+---+---+---+---+---+---+---+---+---+---+----+
這意味着:不要試圖去修改它們。它可能在某些情況下工作,但它不是你應該依賴的東西,如果你重視可移植性甚至一點點。
變化:
char *str_1 = "Hello";
到:
char str_1[] = "Hello";
,因爲這實際上是一樣的:
char str_1[6];
strcpy (str_1, "Hello");
5
您試圖修改調用未定義行爲的字符串文字的內容。字符串文字是一般存儲在只讀內存部分,並具有靜態存儲持續時間。
char *str_1 = "Hello";
。在這種情況下"Hello"
是一個字符串(存儲在只讀部分),並在您嘗試這樣做
str_1[index] = str_1[i];
,而不是使str_1
的指針文字[即修改內容char *str_1 = "Hello"
]使其成爲一組字符,即char str_1[] = "Hello"
。文字的內容將被複制到堆棧中,如果您嘗試修改內容,則不會得到任何段錯誤。
3
變化
char *str_1 = "Hello"; //read only
爲
char str_1[] = "Hello";
+0
這是正確的。如果你會解釋*爲什麼*,你會從我這裏得到讚揚。 – Lindydancer 2011-04-20 05:54:12
相關問題
- 1. 手動反轉字符串不工作
- 2. 遞歸字符串反轉函數
- 3. 字符串操作/處理在Lua,文字的旋轉在一個字符串
- 4. 作爲字符串處理數字
- 5. Laravel處理數字作爲字符串
- 6. Python字符串處理函數
- 7. Python編程字符串處理函數
- 8. 使用反向索引的字符串反轉函數
- 9. 反轉字符串
- 10. 反轉字符串
- 11. 如何處理phantomJS coredump?
- 12. 我的字符串反轉函數在開頭附加了「undefined」
- 13. 這是什麼程序(反轉字符串)在C不工作?
- 14. 在預處理時間將sizeof()的值轉換爲字符串
- 15. 應該如何處理字符串的陣列工作在C
- 16. 如何在PowerShell下處理字符串中的轉義字符(`)
- 17. 在C中調用匯編函數,反轉字符串
- 18. 反轉字符串,不起作用
- 19. C中的反向字符串函數
- 20. 在C++中處理字符串錯誤時的錯誤處理
- 21. 試圖在C++中反轉字符串,但亂碼會出現在反轉字符串處?
- 22. 字符串處理
- 23. 字符串處理
- 24. 排球反應字符串不工作
- 25. 在長字符串處調用函數
- 26. 如何在批處理文件函數中發送字符串作爲參數?
- 27. 處理非ascii字符串作爲數組和 字符
- 28. PHP:處理字符串操作中的引號,轉義等
- 29. 在Python中的字符串反轉
- 30. 字符串處理文檔字符串
+1,因爲你釘它,但字符串_not_「存儲在只讀部分「,標準沒有什麼可說的,只是修改它們是未定義的。 – paxdiablo 2011-04-20 05:37:24
@paxdiablo:是的,你是對的。該標準沒有說任何有關字符串文字存儲的地方,但大多數實現(我知道)將它們存儲在只讀部分。 **一般添加** ** – 2011-04-20 05:40:45