2016-10-18 4 views
0

"2つの文字列の配列へのポインタを返す最初は偶数インデックスの文字列 です。奇数インデックスである S」単純なCエクササイズが間違っている:2つの文字列の配列へのポインタを返そうとしています

char **parity_strings(const char *s) { 

char** parity = malloc(sizeof(char*) * 2); 
char even_strings[] = ""; 
char odd_strings[] = ""; 
int x = 0; 
int y = 0; 

for (int i = 0; i < strlen(s); i++) { 

    if ((i % 2) == 0) { 

     even_strings[x] = s[i]; 
     x++; 
    } 
    else { 
     odd_strings[y] = s[i]; 
     y++; 
    } 
} 

parity[0] = even_strings; 
parity[1] = odd_strings; 



return parity; 

} 

int main(int argc, char **argv) { 
    char **r = parity_strings(argv[1]); 
    printf("%s %s %s", r[0], r[1], argv[1]); 
    return 0; 
} 

からの文字が私の論理は理にかなっていますが、出力は常に間違っています。たとえば、入力がabababの場合、私はabababを返し、期待される出力はaaa bbb abababです。私は何を間違えたのですか?

+1

'char even_strings [] =" ";'は長さ1 - ターミネータを持ちます。したがって、インデックス付け 'even_strings [x] = s [i];はUBであり、寿命がなくなったローカル文字列へのポインタも返されます。 –

+0

Cが文字列をどのように扱うかを再検討することを検討するかもしれません。それらは高レベルのオブジェクトではなく、単に 'char'の配列で、ASCIIコードで埋められ、最後に' nul'ゼロがあります。右辺値として使用できるものではありません。 (しかし、文字列へのポインタ、あなたができる) – infixed

答えて

2

even_stringsという名前の文字列はローカル変数であるため、関数が返ってもそのメモリは解放されるため、呼び出し元へのポインタを返そうとすると有効ではありません。

char * even_strings = malloc(some_size); 

同じことがあなたのodd_strings文字列のために行く:このような何かに

char even_strings[] = ""; 

は、この行を変更してみてください。

さらに、some_sizeの値を選択して、プログラムが各文字列に十分なメモリを割り当て、書き込むすべてのデータを保持できるようにしてください。

+0

ありがとう!それはとても役に立ちます。 – TimelordViktorious

2

even_stringsおよびodd_stringsはそれぞれサイズ1のアレイである。あなたのコードは境界外に書きます(even_strings[x] = s[i]odd_strings[y] = s[i])。さらに、それらは一旦parity_stringsが戻ると存在しなくなるローカル変数なので、返されるポインタはガベージです。

関連する問題