我正在尝试制作一个扫描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;
}
答案 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_it
,a
,b
,num1
和num2
的值必须始终是整数的内存地址。在函数 num3
中,变量changer
,num1
和num2
的值是ALREADY内存地址。写num3
时,*num1
的值是整数,但不是整数的内存地址。因此,您需要按如下方式调用 *num1
函数:
swap