[英]assigning elements of c-string
我正在嘗試對C字符串進行冒泡排序-請參見下面的函數。 目的是根據ASCII碼對字符進行排序。
直到運行時,編譯器才會抱怨,這時我遇到了分段錯誤。 我已經運行了gdb,程序正常運行到第12行。在第12行,gdb調試器聲明“ Process gdb-inferior killed”。
為什么第12行不正確? 我在程序的其他地方遇到了這個問題-無法將字符分配給c字符串的元素。 我知道strcpy()是字符串分配所需要的,但是使用特定元素我認為還可以。 任何幫助表示贊賞。
1. void bubblesort(char *str)
2. {
3. int length = strlen(str);
4.
5. for (int i = length - 1; i > 0; i--)
6. {
7. for (int j = 0; j < i; j++)
8. {
9. if (str[j] > str[j + 1])
10. {
11. char temp = str[j + 1];
12. str[j + 1] = str[j];
13. str[j] = temp;
14. }
15. }
16. }
17. return;
18. }
我已經測試過您的代碼,並且效果很好。 關於您的代碼段為何不起作用,我確實有2種理論。
理論一:您正在嘗試寫入字符串文字,這需要像這樣的行:
char* str = "abc";
您的操作系統很有可能會在單獨的只讀頁面中引用“ abc”,當您在12處寫入變量時,這將導致SEGFAULT。
此處的更多信息: 為什么在寫入以“ char * s”而不是“ char s []”初始化的字符串時出現分段錯誤?
理論2:
該錯誤可能是在strlen函數中,該函數需要以null結尾的字符串。 例如,免費的BSD版本如下所示:
size_t strlen(const char * str)
{
const char *s;
for (s = str; *s; ++s) {}
return(s - str);
}
想象一下,您將“ abc”存儲在內存中而沒有空終止字節。 strlen將照看字母“ c”,直到找到單個\\ 0(0x00)字節為止。 該存儲器是只讀的,在這種情況下,當您嘗試對其進行寫操作時,將在第12行中創建SEGFAULT。 (所有以前的訪問權限都是只讀的)
我想我解決了自己的問題...
當調用這樣的函數時:
foo(“ some string”);
假定以下形式的foo()的定義:
foo(char * str){.......}
將給出“棄用的轉換”警告。 這很煩人,但是除非您要在函數foo中修改str,否則可以忽略它。 自動轉換將“某些字符串”轉換為常量字符指針,而不是常規的指針。 無論您在聲明/定義中編寫foo(char * str)還是foo(const char * str)都會執行此操作-如果您編寫前者,它只會給出警告。
總之,在這種情況下,編寫foo(const char * str)是更好的樣式,如果必須在函數中修改str,則應在foo函數中創建變量的副本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.