我试图在C中增加一个值并返回旧值,我正在使用指针。问题是即使我使用指针,新值仍为0。
#include <stdio.h>
#include <stdlib.h>
int increment (int *mem) {
int tmp;
tmp = *mem;
*mem++;
return tmp;
}
int main () {
int a = 0;
printf("The old value of a is \t %d", increment(&a));
printf("The new value of a is \t %d", a);
}
现在,当我运行此方法时,我得到的值为0;我期待在第二个printf中有1个。我不知道我在这里做错了什么。
答案 0 :(得分:9)
更改此
*mem++;
到这个
(*mem)++;
问题在于运营商的优先权。您可能需要阅读C Operator precedence。
那么,您的代码有什么作用?它会增加指针的值,因为++
运算符首先被激活,然后*
被激活,没有实际效果。
因此,您的代码调用undefined behavior,因为您访问(并最终写入)无效的内存位置,因为指针在写入值之前递增。
答案 1 :(得分:5)
也许你错过了一些括号?
#include <stdio.h>
#include <stdlib.h>
int increment (int *mem) {
int tmp;
tmp = *mem;
(*mem)++; // problem was here.
return tmp;
}
int main (){
int a = 0;
printf("The old value of a is \t %d", increment(&a));
printf("The new value of a is \t %d", a);
}
答案 2 :(得分:0)
除了其他人发布的关于运算符优先级的内容之外,如果要传递指向要递增的int的指针,则没有理由通过tmp
返回int的副本。您可以访问函数外的mem
中的值。
#include <stdio.h>
#include <stdlib.h>
void increment (int *mem) {
(*mem)++;
}
int main () {
int a = 0;
printf("The old value of a is \t %d", a);
increment(&a);
printf("The new value of a is \t %d", a);
}