首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函数返回int,但得到奇怪的行为。

函数返回int,但得到奇怪的行为。
EN

Stack Overflow用户
提问于 2015-09-25 05:28:27
回答 2查看 71关注 0票数 0

我写了一些代码来计算单词中的位数。当我printf()计数时,它按预期打印32,但是当我将相同的代码插入函数并打印返回值时,它给了我一些疯狂的大数字。

然后,我将代码复制/粘贴回main()中,同时打印计数并打印函数的返回值,并且两者都给了我32,但是如果我在main()函数中注释掉代码,再次打印大号。

有人知道为什么会发生这种事吗?

代码语言:javascript
运行
复制
#include <stdio.h>

int wordlength();

int main() {

printf("%d", wordlength()); // prints 4195424 but
                          // if I uncomment the code below
                          // it then prints 32 like I want

//  int count;
//  unsigned int n = ~0;
// 
//  while( n != 0) {
//      n = n >> 1;
//      count++;
//  }
//  printf("\n%d", count); // prints 32 as expected

    return 0;
}

int wordlength() {

    int count;
    unsigned int n = ~0;

    while( n != 0) {
        n = n >> 1;
        count++;
    }

    return count;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-25 05:30:03

wordlength()函数中,count是一个自动局部变量,没有显式初始化。因此,初始值是不确定的。

引用C11标准,第6.7.9章

如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的。..。

你很容易就能在上面申请加薪了。它调用未定义行为

相关的,附件J.2节,行为不明的原因,

具有自动存储持续时间的对象的值是在不确定时使用的。

因此,您的程序显示UB,并且根本不保证产生任何有效的结果。

解决方案:将count初始化为0。

FWIW,关于评论

//如果我取消下面的代码注释 //然后按我想要的方式打印32

也是UB的结果。

票数 6
EN

Stack Overflow用户

发布于 2015-09-25 05:29:44

您必须将count初始化为0或其他东西,否则它将具有未定义的值。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32775412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档