程序哪里有错误 fun(int *p1,int *p2) { int *p; *p = *p1; *p1 = *p2; *p2 = *p; }
时间: 2024-07-03 12:01:28 浏览: 270
这个函数`fun(int *p1, int *p2)`存在几个错误和潜在问题:
1. 变量声明与赋值:你试图通过`*p = *p1`来分配指针`p`的值,但实际上`p`是一个未初始化的指针,直接赋值可能会导致不确定的行为。正确的做法是先为`p`指向一个内存位置。
2. 临时变量:你的代码没有明确使用`p`这个临时变量。如果你想交换`p1`和`p2`所指向的值,应该使用指针的解引用操作,而不是将`*p`赋值给它们。
3. 指向不确定的数据:由于`p`没有被初始化,如果它指向的是栈上的临时空间,当函数结束时这些值可能会丢失,除非特别指定它指向堆中的数据。
修复后的代码可能如下所示:
```c
void swap(int **p1, int **p2) {
int temp;
*temp = *(*p1); // 保存p1指向的值
*(*p1) = *(*p2); // 将p2指向的值赋给p1
*(*p2) = temp; // 将保存的值赋给p2
}
```
相关问题
void fun(char *w,int m) { char s,*p1,*p2; p1=w;p2=w+m-1; while(p1<p2) { s=*p1++;*p1=*p2--;*p2=s; } } main() { char a[]="ABCDEFG"; fun(a,strlen(a)); puts(a); }
这段代码是一个函数`fun`和一个主函数`main`的示例。函数`fun`的作用是将字符串中的字符进行逆序。主函数`main`定义了一个字符数组`a`,并将其作为参数传递给函数`fun`进行逆序操作,然后使用`puts`函数输出逆序后的字符串。
具体的执行过程如下:
1. 定义字符变量`s`和指针变量`p1`、`p2`,并将指针`p1`指向字符串首地址,将指针`p2`指向字符串尾地址。
2. 进入循环,判断指针`p1`是否小于指针`p2`。
3. 如果满足条件,执行以下操作:
- 将指针`p1`所指向的字符赋值给变量`s`;
- 将指针`p1`后移一位,将指针`p2`前移一位;
- 将变量`s`赋值给指针`p2`所指向的字符。
4. 循环结束后,字符串中的字符已经完成反转。
5. 主函数中定义了字符数组`a`并初始化为"ABCDEFG",然后调用函数`fun(a, strlen(a))`对数组进行逆序操作。
6. 最后使用`puts(a)`函数输出逆序后的字符串。
注意:这段代码中存在一个潜在的问题,即在执行 `*p1=*p2--` 时可能会发生未定义行为,因为 `*p1` 和 `*p2` 是同一个地址,修改同一位置的值可能会导致不可预料的结果。建议修改为 `s=*p1;*p1=*p2;*p2=s; p1++; p2--;` 来避免这个问题。
void fun(char *w,int m) { char s,*p1,*p2; p1=w;p2=w+m-1; while(p1<p2) { s=*p1++;*p1=*p2--;*p2=s; } } main() { char a[]="ABCDEFG"; fun(a,strlen(a)); puts(a); }这段代码的输出结果是什么
这段代码的输出结果将是字符串`"GFEDCBA"`。
代码中的函数`fun`用于将字符串中的字符进行逆序操作。主函数`main`定义了一个字符数组`a`并初始化为"ABCDEFG",然后将数组`a`和其长度作为参数传递给函数`fun`。在函数`fun`中,通过交换指针`p1`和`p2`所指向的字符,实现了字符串反转的目的。
具体的执行过程如下:
1. 字符数组`a`被初始化为"ABCDEFG"。
2. 调用函数`fun(a, strlen(a))`对数组进行反转操作。
3. 在函数`fun`中,使用指针`p1`指向字符串的首地址,使用指针`p2`指向字符串的末尾地址。
4. 进入循环,判断指针`p1`是否小于指针`p2`。
5. 如果满足条件,执行以下操作:
- 将指针`p1`所指向的字符赋值给变量`s`;
- 将指针`p1`后移一位,将指针`p2`前移一位;
- 将变量`s`赋值给指针`p2`所指向的字符。
6. 循环结束后,字符串中的字符已经完成反转。
7. 最后,使用`puts(a)`函数输出反转后的字符串,即输出"GFEDCBA"。
所以,代码的输出结果将是字符串"GFEDCBA"。
阅读全文