簡體   English   中英

C無法訪問地址處的內存

[英]C Cannot Access Memory at Address

我剛接觸C,並且正在練習內存分配和指針,但是遇到了一個我無法解決的問題。 當我調試下面的代碼時,我收到一條錯誤消息,指出行vowelStore [x] = vowelA;的“無法訪問地址處的內存”;

char *DissVowel(char phrase[50])
{  
    char vowelStore[50];

    for(int x=0; x< strlen(phrase); x++)
    {
        switch(phrase[x])
        {
            char *vowelA = malloc(sizeof(*vowelA));

            case 'a':
                vowelA = phrase[x];
                vowelStore[x] = vowelA;
                free(vowelA);
                break;
            default:
                break;
        }
    }

    return vowelStore;
}

基本上,此函數接收一個字符數組(一個字符串短語),然后循環遍歷每個字符,如果當前字符為“ a”,則會分配一個存儲塊,並將“ a”存儲在分配的空間中。 接下來,包含“ a”的該空間的地址將存儲在單獨的數組中,該數組將包含多個地址。 然后,該函數返回此地址數組。

任何幫助深表感謝!

您的代碼有很多問題。

char *DissVowel(char phrase[50])

這是合法的但具有誤導性。 C實際上沒有數組參數。 如果您定義了看起來像數組參數的內容(如您在此處所做的那樣),則會對其進行“調整”以使其成為指針參數-並且長度會被靜默忽略。 上面的內容完全等同於:

char *DissVowel(char *phrase)


for(int x=0; x< strlen(phrase); x++)

這是合法的,但效率低下。 strlen()必須從頭開始掃描字符串,以找到標記字符串結尾的終止'\\0'空字符。 您每次迭代都調用strlen 可以將字符串長度保存在變量中並在條件中進行測試,或者使用其他條件,例如phrase[x] != '\\0' (非常重要的一點: i是用作索引的迭代變量的更常規名稱。)

    switch(phrase[x])
    {
        char *vowelA = malloc(sizeof(*vowelA));

        case 'a':
            /* ... */
            break;
        default:
            break;
    }

switch語句本質上是計算的goto 執行switch ,它會直接跳到case 'a':標簽或default:標簽,並跳過兩者之間的任何內容。 由於這進入了新的作用域,因此將為指針對象vowelA本身分配內存,但是不會執行其初始化,因此vowelA的值不確定。

return vowelStore;

vowelStore是本地數組變量。 在這種情況下,它被“轉換”為指向數組初始元素的指針,等效於&vowelStore[0] 從函數返回時,數組變量將不復存在,因此返回的值是一個懸空指針。

您應該了解如何在編譯器中啟用更多警告。 它應該能夠警告您至少其中一些問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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