2016-05-16 29 views
0

これは私の最初の投稿ですので、私に同行してください。私はしばらくのうちに学校に通った後、Cで書かれています。私は配列全体を同じ行に出力する関数に整数の配列を渡そうとしています(大きな作業の一部として)。私のダウン易しく書き直さコードは、次のとおりです。intポインタを関数に渡して、その配列をC言語で出力します

// main.c 
#include <stdio.h> 

int main(void) { 

    int arr[] = {3,4,5,6,7}; 
    int *ptr = arr; 
    int l = 5; 

    printarr(arr,l); 
    return 0; 
} 

そして

// function printarr 
#include <stdio.h> 

void printarr(char *ptr, int l) { 

    int k = 0; 
    for (k = 0; k < l; ++k) { 
     printf("%d", ptr[k]); 
    } 
} 

をmain.cのをコンパイルし、実行した後、私が手出力は次のようになります。

30004 

私は私を破ってきたように私は感じます簡単な問題を見つけようと壁に向かって頭を下げる。私が繰り返し、メインで配列を印刷すると、私が期待している出力( '34567')が得られますが、私が関数を通してそれを実行しようとすると、悲しいです。私はポインタを誤用していると思うが、ええ、わからない。

お手数ですが、

ありがとうございました。

編集:最初の2つのコメントを見て、私は完全に自分自身を恥じている。みんなありがとう。うわー、ちょうどうわー。あなたはそれにint *を渡しているよう

+1

なぜ 'printarr'は' char * 'を取るのですか? – user2357112

+1

'char * ptr' - >' int * ptr'です。それを使用する前にプロトタイプを置く。 – BLUEPIXY

+0

ちょうど私がどれくらいの時間を今見過ごして過ごしたのはばかげている。私の言葉。新鮮な目に感謝します。 – GGubs

答えて

1

あなたが

void printarr(int *ptr, int l) 

にあなたの関数を変更する必要があります。 @Malifeが指摘しているように、コンパイラの警告を-Wallで有効にして、適切なメッセージを表示する必要があります。オプションで、すべての警告を-Werrorでエラーにします。

charintは、サイズが異なっており、intがはるかに大きい。出力から見ると4倍も大きくなります。 charの値を見ているときに、数字が部分的に割り当てられているところのメモリを繰り返します。

+0

gccでコンパイルしましたが、奇妙なことに、コンパイラエラーは発生しませんでした。答えを洗い出してくれてありがとう。 – GGubs

+1

-Werrorコンパイラオプションがない限り、一般的にエラーは発生しません。しかし、少なくとも、-Wallコンパイラオプションを必ず追加してください。それはあなたがCに再び触れるように、多くの頭痛を救うでしょう。 – Malife

0

printarrはint配列ではなく、文字列を期待しなければならないので、メイン、INT * PTR = ARRで

void printarr(int *ptr, int l) 

なければなりません。使用されていないか、必要ではない。

あなたはproballyまた、あなたがプリントアウトされ、配列の各値の間にスペースや改行を入れたい:

void printarr(char *ptr, int l) { 

    int k = 0; 
    for (k = 0; k < l; ++k) { 
     printf("%d\n", ptr[k]); 
    } 
} 
+0

多くのありがとう。 * ptrは私がこれをフォークしたコードの痕跡です。乾杯! – GGubs

0

私は、問題は、あなたが「printarr」のcharのポインタを渡すことだと思います。実際に "ptr"を渡すと、次のような状況になります。00000011 00000000 00000000 00000000 00000100 .... charには8ビットのint 32ビットがあり、Ramはしばしばバイト順のリトルエンディアンです。次に、あなたはintを渡すprintfを呼び出し、バイトは32ビットに拡張されます。3 0 0 0 4.メインの "ptr"はintなので、この場合はintを出力します。3 4 5 6 7. "printarr"のchar * ptr - > int * ptrを変更する必要があります

関連する問題