【问题标题】:Argument value in C immutable? [closed]C中的参数值不可变? [关闭]
【发布时间】:2016-07-25 21:11:43
【问题描述】:

我有以下代码:

void func(uint8 *var) {
    uint8 tempvar;

    if (var)
        var = &tempvar;

    *var = 0;
}

我使用以下方法调用函数:

func(NULL);

代码在“*var = 0;”行给出了分段错误因为 var 仍然指向内存地址 0x0。我不明白为什么我对临时变量的赋值不起作用!

【问题讨论】:

  • “为什么我对临时变量的赋值不起作用”。好吧,它不起作用,因为如果var 最初为空,您明确要求程序跳过该分配。您的if 条件正是如此。
  • @πάνταῥεῖ - 好吧,它是范围内的局部变量,我只在范围内使用它。该参数是单个指针,地址的更改不会修改调用者变量。因此,没有在其范围之外访问的变量。
  • 已经知道了...

标签: c pointers segmentation-fault


【解决方案1】:

因为您省略了!。您正在测试变量是否存在,但您应该测试它是否不存在if (!var) ...

进一步扩展...varuint8 * 类型,因此 var 本身就是一个指针。通过编写if (var),您正在测试该指针是否不为NULL。在伪代码中,您的代码说:

if (the var pointer already exists)
    assign a new pointer to it (make it point to somewhere else)

但如果它不存在(如果它指向 NULL),则不要理会它。您可以使用调试器或简单的打印语句来验证这一点。因此,您以空指针结束分配,并使您的程序崩溃。

【讨论】:

  • 不 if(var) 转换为 if(var == 0) 相当于 if(var == NULL)?
  • 不。 if (...) 是一个测试是否为真。零 (NULL) 值提升为 false;所有其他值都为真。不管怎样,试试吧!
  • @H.Guijt 这不是肯定的原因,如果 (NULL) 为假
  • 好吧,如果你确定这一点,我想你一定是对的。我的意思是,我从九十年代开始就只用 C++ 编程,我知道什么...
  • @Kunal Kapoor: if(var) 转换为 if(var != 0),这与您的假设完全相反。
猜你喜欢
  • 1970-01-01
  • 2015-10-06
  • 2011-02-19
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多