嘿,我只是在参数1大于参数2时才试图切换两个参数。
到目前为止我得到的是:
#include <stdio.h>
void ascending2(int*, int*);
int main(void){
int ptr1 = 20;
int ptr2 = 10;
printf("ptr1 = %d, ptr2 = %d", ascending2(&ptr1, &ptr2));
return 0;
}
void ascending2(int *ptr1, int* ptr2){
int *value;
if( *ptr1 >= *ptr2 ){
*value = *ptr1;
*ptr1 = *ptr2;
*ptr2 = *value;}
}
任何人都可以建议我可能出错的地方,谢谢。
答案 0 :(得分:4)
这是因为在ascending2
函数中,您将value
声明为指针,但实际上并不是指向任何地方。因此,当您取消引用它时,您将取消引用未初始化的指针,该指针将导致undefined behavior。
有两个明显的解决方案:要么使value
指向某个地方有效,要么更好地将其声明为非指针变量。
您的printf
来电也存在问题,因为ascending2
被宣布退回void
,换句话说,它根本不会返回任何内容,但您还要打印两个值。这也会导致未定义的行为。
此处的解决方案是单独调用该函数,然后使用printf
和ptr1
变量调用ptr2
(顺便说一下,这些变量名称不是很好,因为它们不是实际指针)。
答案 1 :(得分:2)
printf("ptr1 = %d, ptr2 = %d", ascending2(&ptr1, &ptr2));
这里ascending2(..)
没有返回任何内容。
需要更改printf
。像
ascending2(&ptr1, &ptr2);
printf("ptr1 = %d, ptr2 = %d",ptr1,ptr2);
你的功能应该是
void ascending2(int *ptr1, int* ptr2){
int value; // change *value to value
if( *ptr1 >= *ptr2 ){
value = *ptr1; // change *value to value
*ptr1 = *ptr2;
*ptr2 = value;} // change *value to value
}
答案 2 :(得分:1)
您声明的value
是一个指针。将其更改为int value
。
答案 3 :(得分:1)
在这里,错误得到纠正。
#include <stdio.h>
void ascending2(int*, int*);
int main(void){
int ptr1 = 20;
int ptr2 = 10;
ascending2(&ptr1, &ptr2); //Fix1
printf("ptr1 = %d, ptr2 = %d", ptr1, ptr2);
return 0;
}
void ascending2(int *ptr1, int* ptr2){
int value=0; //Fix2
if( *ptr1 >= *ptr2 ){
value = *ptr1;
*ptr1 = *ptr2;
*ptr2 = value;}
}
Fix1:
参数不应该像你那样传递给printf
语句。函数ascending2也不会返回任何值。所以调用ascending2 API 1st然后打印ptr1,ptr2的值。要了解有关printf
的更多信息,请参阅以下链接。
http://www.cplusplus.com/reference/cstdio/printf/
FIX2:
在ascending2函数内部,不需要使用value
作为指针变量。它可以只是整数。如果使用value
作为指针,则应提供适当的内存。
答案 4 :(得分:0)
只是添加一些建议,已经有了很好的答案:可以改进交换功能:
void ascending2(int *ptr1, int* ptr2)
{
if( *ptr1 > *ptr2 )
{
const int tmp = *ptr1;
*ptr1 = *ptr2;
*ptr2 = tmp;
}
}
改进:
>
进行比较,如果两个值相等则无需执行任何操作,因此使用>=
进行比较是没有意义的。tmp
,使其更加清晰。 &#34;值&#34;非常通用。const
,因为它在分配后不会发生变化。