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 回答
0

下面的代码接近您的原始代码,修复了错误,并进行了一些调整以达到良好的效果。主要修复是替换*kkey(这几乎是@pst 和@SylvainL 已经说过的。)

从算法的角度来看,原因是您需要在外部的某个地方array保存正在移动的值,而其他array元素则被移动。否则你最终会覆盖array元素,我怀疑这是你从“ ......当我*从双方移除它的工作但答案是错误的”判断时发现的。 ”评论。

插入排序的维基百科条目有一个很好的动画,很好地说明了这一点:(
在此处输入图像描述 图片来自 Swfung8 CC BY-SA 许可页面

请参阅其他调整的代码注释,因为它们与问题无关,只是您可以接受或离开的有用指针;-)

#include<stdio.h>

int main() 
{
    int array[]={5,3,4,1,8,9,2,7,6,0};

    int elm, key, i;
    int *ptr=array;

    // Calculate the number of array elements so the code will still 
    // work if the data set changes.  A good habit, rather than a necessity 
    // in this code, but it is used in two places... ;-) .

    int array_len = sizeof(array) / sizeof(int);

    for(elm=1; elm < array_len; elm++) {
        printf("---------iteration %d--------------\n",elm);
        key=(ptr+elm);
        printf("key=%d\n", key);

        // The while loop here was a for loop in disgise.

        for ( i=elm-1; i >= 0 && key < *(ptr+i); i-- ) {
            *(ptr+i+1) = *(ptr+i);
        }

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

        // x declaration moved to here as it is only used as a loop counter

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

        printf("\n");
    }

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

    printf("\n");
}
于 2012-06-15T12:15:23.230 回答