我是指针新手,我正在尝试创建一个函数,将变量 a 的值更改为变量 b ,变量值 b < / strong>变量 a 。
我认为除了功能外,我的一切都很正确。在函数中我试图使指针 a ( * a )的值并将其分配给值指针 b 具有,并且副verca。但是我的输出是“a现在是y而b现在是y”。
这是因为当我将 * a 分配给 b 时, b 会获得 * a 的值刚改成 y ?
#include <stdio.h>
void change(char* a, char* b)
{
*a = b;
*b = a;
}
int main(void)
{
char a = 'x';
char b = 'y';
printf("a is now %c and b is now %c\n", a, b);
change(&a, &b);
printf("a is now %c and b is now %c\n", a, b);
return 0;
}
答案 0 :(得分:6)
您的change
功能错误:
void change(char* a, char* b)
{
char temp = *a;
*a = *b;
*b = temp;
}
首先创建一个临时变量 - 将其复制到临时变量中,然后交换该值。这一行是UB:
*a = b;
*b = a;
您正试图将指针的值存储在char中。
答案 1 :(得分:0)
是的,您的第一个作业会覆盖第二个作业所需的值。
解决方案是在交换期间使用一些临时存储来保存其中一个变量值:
void change(char *a, char *b)
{
const char old_a = *a;
*a = *b;
*b = old_a;
}
还有一个技巧可以解决这个问题(使用按位异或),但这很可怕所以忽略它。