簡體   English   中英

分配c字符串的元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM