2017-09-14 27 views
0

としてC文字列の可変長配列を渡す、私はCストリングの可変長配列を宣言した後secondPass(呼び出された関数に渡す)私のメイン関数の関数引数

()、Iが実行しますループは、dec_instructionという文字列の内容を決定します。それを配列に追加しようとします。

int main(int argc, char *argv[]) { 

    /* Logic to decide num_commands */ 

    char machine_instructions[num_commands][11]; 
    secondPass(machine_instructions, num_commands); 
} 


secondPass(char **machine_instructions, int num_commands){ 
    for(int i = 0; i < num_commands; ++i){ 
     char dec_instruction[11]; 

     /* Logic to decide contents of dec_instruction */ 

     strcat(machine_instructions[i], dec_instruction); 
    } 
} 

申し訳ありません私のコードの完全な内容を投稿できません。これはクラスプロジェクト用であり、コードの共有に関するルールはかなり厳しいものです。

とにかく、i = 1のときに、最後に近いstrcat()行がEXC_BAD_ACCESSをスローします。私が知る限り、dec_instructionは他のものと同様に有効なC文字列です。私のエラーの原因は何ですか?

+1

'char **'は 'char [] []'を指すことができません。 'machine_instructions [1]'は 'machine_instructions [0]'の後に 'sizeof(char *)'になります –

+0

呼び出しや関数宣言のためにコンパイラから型エラーが出てきたはずです。 – melpomene

+0

'char dec_instruction [11]; ... strcat(machine_instructions [i]、dec_instruction); 'は、コードが確かに_string_ではない配列に文字列を連結しようとするときに問題になります。 'strcat()'コールの前に 'dec_instruction []'の内容は何ですか? – chux

答えて

1

引数char **machine_instructionsは、タイプchar[][11]の2次元配列ではなく、charへのポインタへのポインタです。これはポインタの「配列」へのポインタとしてよく使われますが、決して文字配列の配列ではありません。

コードでは、​​はcharへの参照を逆参照しようとしますが、渡すコンテンツはプレーンな文字であり、ポインタの値ではありません。したがって、BAD_EXCESS

char machine_instructions[][11]を使用すると問題が解決するはずです。