ポインタ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
馬鹿太郎

ポインタ

#1

投稿記事 by 馬鹿太郎 » 16年前

配列3つをstr1、str2、str3と用意して、str1のそれぞれの要素がstr2の要素と一致したらstr3に格納する
プログラムです。その際ポインタを使います。

実行したら0になりました。どうしてでしょうか?また、どこがおかしいのですか?

#include <stdio.h>

void main()
{
int str1[5] = {8, 10, 13, 6, 9};
int str2[5] = {3, 6, 7, 9, 13};
int str3[5] = {0};
int i, j, k;
int *p1, *p2, *p3;

p1 = str1;
p2 = str2;
p3 = str3;

for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) {
if (*p1 == *p2) {
*p3 = *p1;
p3++;
break;
}
p2++;
}
p1++;
}

for (k = 0; k < 5; k++) {
printf("%d\n", *p3);
}
}

kazuoni

Re:ポインタ

#2

投稿記事 by kazuoni » 16年前

規約をよんでいらっしゃいますか?
コードを載せる際には、プレタグで囲いましょう。

とりあえずi=0の時はうまく操作できていますが、
i=1になったとき、p2は確保した配列を超えた領域にアクセスしています。
まずはここから見直されてください。

まず紙に書くなりしてどういう動きになるか、
どうすれば改善できるか検討してみてください。

(字下げもされたほうが、皆さんも見やすいかも・・・。)

box

Re:ポインタ

#3

投稿記事 by box » 16年前

> 実行したら0になりました。どうしてでしょうか?また、どこがおかしいのですか?

それを調べるのが「デバッグ」という作業です。
いちばん基本的と思われる方法は、「この辺がおかしい」と
当たりを付けたところにprintf()を書いて、
おかしいと思われる変数やそれに関連する変数の値を
出力してみることです。
デバッグを人任せにしていると、実力がなかなか付かないと思います。

「プログラムは思ったとおりに動かない。書いたとおりに動く。」

ところで、この前の問題は片が付いたのですか?

たかぎ

Re:ポインタ

#4

投稿記事 by たかぎ » 16年前

> 実行したら0になりました。

何が0になったのでしょうか?

> どうしてでしょうか?

たまたまそのように動作したからです。

> また、どこがおかしいのですか?

mainの返却値の型がvoidですので未定義の動作になります。
何が起きても不思議ではありません。

TOMONORI

Re:ポインタ

#5

投稿記事 by TOMONORI » 16年前

ちょっと一言いいですか。

このコードの動作はとても面白いので詳しく解析してみるといいと思います。
環境によっては多くの場合if文の中を実行することになると思うのですが
それはなぜなのか、とか配列とポインタの関係などを考えてみるといいかもです。

SCI

Re:ポインタ

#6

投稿記事 by SCI » 16年前

for (i = 0; i < 5; i++) { 
    for (j = 0; j < 5; j++) { 
        if (*p1 == *p2) { 
            *p3 = *p1; 
            p3++; 
            break; 
        } 
    p2++; 
    } 
p1++; 
}
この部分、非常に惜しいことをしていますね。
つまり、総当りで比べて一致したらstr3に順番に格納したいのでしょうが、ループ毎のポインタ変数の初期化が抜けています。
カウンタ変数を活用して、配列を使う形で書くと、最初はやりやすいのでは。

閉鎖

“C言語何でも質問掲示板” へ戻る