2016-09-10 19 views
-1

私はC言語を習得していないので、メモリ割り当てとポインタで練習していましたが、私は回避できない問題を抱えています。以下のコードをデバッグすると、vowelStore [x] = vowelA;行に「アドレスでメモリにアクセスできない」というエラーが表示されます。Cアドレスにメモリにアクセスできない

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」を含むこのスペースのアドレスは、複数のアドレスを含む別のアレイに格納されます。この関数は、このアドレスの配列を返します。

ご協力いただきありがとうございます。

+0

'vowelA = phrase [x];'は、 'malloc'から得られたメモリへのポインタを上書きし、別の型であるというコンパイラの警告を生成します。 'malloc'で得られたポインタを一旦破棄すると、後で' free'することはできません。いずれの場合でも 'char * vowelA = malloc(sizeof(* vowelA));'はメモリの1バイト**を割り当てます。 –

+0

'char'配列は' char * 'を格納できません。 (関連性がない - あるいはあなたのポインタの不一致のためにおそらく関連しますが、 'vowelA'自体は' char * 'である必要はなく、 'sizeof(任意のポインタ)'である必要はありません。) – usr2564301

+0

'char * vowelA = malloc(sizeof(* vowelA));'これは実行されないかもしれません。 – BLUEPIXY

答えて

0

コードには多くの問題があります。

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]に相当します。関数から戻ったときに配列変数が存在しなくなるので、戻ってきた値はぶら下がったポインタになります。

コンパイラで警告を有効にする方法を知る必要があります。これらの問題の少なくともいくつかについて警告することができます。

関連する問題