【问题标题】:Increment content of pointer增加指针内容
【发布时间】:2015-10-07 04:59:26
【问题描述】:

我试图在 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);
}

现在,当我运行此方法时,我得到的 a 值相同,即 0;我在第二个 printf 中期待 1。我不知道我在这里做错了什么。

【问题讨论】:

  • 试试(*mem)++ 然后阅读运算符优先级
  • 您真的应该学习如何使用调试器,并在编译器中启用所有警告和调试信息,并阅读有关 C 语法的更多信息。不要写一些你不掌握的语法(所以要加括号就加括号)
  • 顺便说一句,我从 1980 年代开始就使用 C 进行编码,而我从未编码 *mem++,因为我觉得它很难读(所以我编码 *(mem++) 或 @987654325 @ 甚至mem[0]++....),即使它有一些明确的含义

标签: c pointers operators


【解决方案1】:

除了其他人发布的关于运算符优先级的内容之外,如果您传递一个指向要递增的 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);
}

【讨论】:

    【解决方案2】:

    改变这个

    *mem++;
    

    到这里

    (*mem)++;
    

    问题在于运营商的优先级。您可能想了解C Operator precedence


    那么,您的代码是做什么的?它增加了指针的值,因为++ 操作符首先被激活,然后* 被激活,没有实际效果。

    因此,您的代码调用了undefined behavior,因为您访问(并最终写入)了一个无效的内存位置,因为指针在值写入之前递增。

    【讨论】:

    • 意味着使用 C 版本。我已经把它删了。没有注意到您的链接。
    • IMO,你应该提到 OP 的代码调用了 UB。
    • 好主意@CoolGuy,因为他修改了指针的值并访问它,对吧?这就是你的意思还是你有别的想法?没关系的csnate。
    • 是的。 OP 的代码写入了一个无效的内存位置,因为指针在值写入之前递增。
    • Bravo @CoolGuy,这确实改善了答案,谢谢。如果您想在答案中进行其他更改,请告诉我。
    【解决方案3】:

    也许你漏掉了一些括号?

    #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);
    }
    

    【讨论】:

    • 括号应该用于复数。因为我是希腊人,我不得不告诉! :P 顺便说一句,完整代码 +1。
    猜你喜欢
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 2018-05-27
    • 2020-12-12
    • 1970-01-01
    • 2012-01-02
    相关资源
    最近更新 更多