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