交换程序的问题,程序崩溃

时间:2016-03-19 06:03:30

标签: c pointers

我正在尝试制作一个扫描3个整数的程序,然后通过一个按这种方式对它们进行排序的函数传递它们 - 最大的数字是'num3',第二个是'num2',最低的是将在'num1'但由于某种原因,程序在进入sort函数时崩溃。

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

void swap(int* a, int* b);
void changer(int* num1, int* num2, int* num3);

int main()
{
    int num1 = 0;
    int num2 = 0;
    int num3 = 0;

    printf("Please enter your value for 'num1': ");
    scanf("%d", &num1);
    getchar();

    printf("Please enter your value for 'num2': ");
    scanf("%d", &num2);
    getchar();

    printf("Please enter your value for 'num3': ");
    scanf("%d", &num3);

    printf("\nYour nums before- \n");
    printf("num1 == %d\n", num1);
    printf("num2 == %d\n", num2);
    printf("num3 == %d\n", num3);

    changer(&num1, &num2, &num3);

    printf("\nYour nums after- \n");
    printf("num1 == %d\n", num1);
    printf("num2 == %d\n", num2);
    printf("num3 == %d\n", num3);

    system("PAUSE");
    return 0;
}

void changer(int* num1, int* num2, int* num3)
{
    if (*num1 > *num3)
    {
        swap(*num3, *num1);
    }
    else if (*num1 > *num2)
    {
        swap(*num1, *num2);
    }

    if (*num2 > *num3)
    {
        swap(*num3, *num2);
    }
}

void swap(int* a, int* b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

3 个答案:

答案 0 :(得分:2)

当你将指针传递给swap()时,你不应该取消引用指针,因为它需要int *并且你将传递int因此导致未定义的行为并且在你的情况下崩溃。编译器应该警告不兼容的参数。

更改

的每次出现
swap(*num1, *num2);
/*   ^      ^ remove these */

swap(num1, num2);

答案 1 :(得分:0)

swap(int *,int *)期望传入整数指针,假设num1 = 0和num2 = 2的值,当你将这些值传递给swap()时,通过解除引用你正在调用这个交换(0,2)或32位系统

  

交换(0x00000000,0x00000002)

在内部交换(int * a,int * b)中,您取消引用该行的内存位置0x00000000(不是 a 指向的内存),

int temp = *a;

然后您在此行取消引用0x00000002 b 并尝试将其分配给0x00000000(通过解除引用 * a

*a = *b;

您正在生成

  

内存访问违规情况。

导致崩溃。总结一下,请不要忽略编译器警告。编译器会在您进行swap()调用的行上发出警告。

  

&#39; int *&#39;间接水平与&#39; int&#39;

不同

答案 2 :(得分:0)

两个函数都将整数指针(即整数的内存地址)作为参数。因此,参数log_itabnum1num2的值必须始终是整数的内存地址。在函数 num3 中,变量changernum1num2的值是ALREADY内存地址。写num3时,*num1的值是整数,但不是整数的内存地址。因此,您需要按如下方式调用 *num1 函数:

swap