2

ここで何が起こっているのかわかりません:

#include<stdio.h>
int main() 
{
    int i, j, *k, x,array[]={5,3,4,1,8,9,2,7,6,0};
    int *ptr=array;

    for(j=1;j<10;j++) {
        printf("---------iteration %d--------------\n",j);
        *k=*(ptr+j);   // the segmentation error is occurring here at this line
        printf("key=%d\n",*k);
        i=j-1;

        while( i>=0 && *k < *(ptr+i)) {
            *(ptr+i+1)=*(ptr+i);
            i--;
        }

        *(ptr+i+1) = *k;
        printf("%d\n",*(ptr+i+1));

        for( x=0;x<10;x++)
            printf("%d,",*(ptr+x));

        printf("\n");
    }

    for( i=0;i<10;i++)
        printf("%d,",*ptr++);

    printf("\n");
}

ループ内のprintfステートメントの直後にエラーが発生し、両側から削除すると機能しますが、答えは間違っています。for*

これは、C のポインターを使用した挿入ソートです。

4

4 に答える 4

5

問題は、あなたが言ったように、直後ですprintf()

*k=*(ptr+j)

右側を見るまでには至りませんでした。左側には間違いなく問題があります。ポインタが初期化されていないため、そのアドレスへの書き込みはほぼ確実に問題を引き起こします。

右側にもメモリアクセスがありますが、調べてみると大丈夫そうです。

于 2012-06-15T00:16:24.597 に答える
2

あなたはkポインタとして宣言しましたが、それを指すためのメモリを与えていません。そのため、ポインタに書き込んだときに何が起こるかわかりません。で書き込むためのメモリを与えますk = malloc(sizeof array)

于 2012-06-15T00:24:00.363 に答える
1

他の人が述べたように、問題の一部は、値を格納するために初期化されたポインターを使用していることです。コードを読んだ後、 *k を単に整数値を格納するために使用しているように見えます。したがって、ポインターを持つ必要はなく、通常の int 値を使用するだけで十分です。

int i, j, k, x,array[]={5,3,4,1,8,9,2,7,6,0}; 
int *ptr=array; 

for(j=1;j<10;j++) { 
    printf("---------iteration %d--------------\n",j); 
    k=*(ptr+j);   // the segmentation error is occurring here at this line 
    printf("key=%d\n",k); 
    i=j-1; 

    while( i>=0 && k < *(ptr+i)) { 
        *(ptr+i+1)=*(ptr+i); 
        i--; 
    } 

    *(ptr+i+1) = k;
}

さらに、*(ptr+i) は ptr[i] と同じものを表しますが、通常の C/C++ の慣例では後者の形式を使用します。

于 2012-06-15T10:36:09.283 に答える