2012-04-07 5 views
1

私はポインタで指されたメモリの内容のブロックを表示する関数を使用します。 しかし、希望の出力を得られなかった、私はこれに新しいです、私が間違っている場合、私を修正してください。 入力サイズ= 3、要素= 1,2,3の場合、出力= 1のみとなります。関数内でポインタのポインタを使用する正しい方法は何ですか?

は、ここでは、コードです:

#include <stdio.h> 
#include <stdlib.h> 

void merge(int **arr1); 

int main(void) { 
    int size1; 
    printf("Give me the size of first array\n"); 
    scanf("%d", &size1); 

    int *arr1 = malloc(size1*sizeof(int)); 
    int *p1=arr1; 
    printf("Give me the elements of first array\n"); 
    int index1; 
    for(index1 = 0 ; index1<size1; index1++) 
    scanf("%d", p1++); 

    merge(&arr1); 
    return; 
} 

void merge(int **arr1) { 
    while(**arr1) //**arr1 is the content of the passed array, if there 
        // is an int in it, print that out and increment to next one 
    { 
     printf("%d", **arr1); // ** is the content and * is the address i think, right? 
     *arr1++; 
    } 
} 
+4

どのような出力を得ましたか?あなたは何を期待しましたか?これまでに何をデバッグしましたか? –

+2

コードをフォーマットしてください。 –

+0

申し訳ありません、私はそれを編集しました –

答えて

3

あなたmerge()コードが配列がゼロで終了することを期待しています。呼び出し元コードはそれを実行していないので、動作は指定されていません(私はあなたのコードを試したときにsegfaultを取得しました)。

他の問題は、あなたが*arr1の前後に括弧を挿入する必要があることです。

(*arr1)++; 

私はこの変更を使用してコードを実行し、最後の要素のためにゼロを入力すると、あなたのコードは正常に動作します。

+0

右、そのポインタ値に有効なものがあるかどうかを確認したいのですが、while文を入力する必要がありますか? –

+0

@qwrqwrそれを行う1つの方法は、 'malloc'に余分な要素を割り当て、ループの*後*にゼロを入れることです。もちろん、これによってユーザーはゼロになることはありません。これが問題であれば、別の番号をガードとして使用するか、2番目のパラメータとして 'size1'を' merge'に渡してください。 – dasblinkenlight

+0

余分なサイズのパラメータを使用せずにその要素が有効かどうかをチェックする方法がないと言っていますか? –

関連する問題