【问题标题】:Unexpected Behaviour on calling simple C function调用简单 C 函数时的意外行为
【发布时间】:2022-01-25 23:48:03
【问题描述】:

在运行以下 c 代码时,输​​出既不是 0 也不是常数,即使在尝试在随机块中使用一些打印语句后,我也无法断定发生了什么

#include <stdio.h>

int random(int start, int end); // start, end are just added to make sure that results are not same due to caching.

int main(void) {
    int i;
    for (i=0; i<10; i++)
        printf("%d\n", random(0, i));

    return 0;
}

int random(int start, int end) {
    int out_num;
    return out_num;
}

$ gcc -o ./compiled/bogo_binary_search bogo_binary_search.c && ./compiled/bogo_binary_search 
0
32653
32653
32653
32653
32653
32653
32653
32653
32653

【问题讨论】:

    标签: c gcc random


    【解决方案1】:

    未初始化的变量具有不确定的值。这只意味着标准没有说明价值应该是什么。如果需要,编译器可以使用固定值或随机值。它在实践中最常做的是使用内存中的任何内容而不进行设置。所以在某种意义上它是随机的,因为它不是完全可预测的。

    但是作为一个随机生成器它很差。有些值比其他值更有可能。全零非常常见。而且如果你在一台机器上连续多次运行程序,很可能下一次得到的值都是一样的。

    当然,读取未初始化的变量是未定义的行为,所以理论上,编译器可以做任何事情。但它很可能只会打印该值,无论它是什么。

    【讨论】:

    • 真的很有帮助,谢谢。
    【解决方案2】:
    int random(int start, int end) {
        int out_num;
        return out_num;
    }
    

    局部变量out_num未初始化。它可以有任何值,或者当你尝试使用它时你的程序可能会崩溃。

    【讨论】:

    • 那是因为有人告诉我,仅仅在 c 中声明变量就会根据变量在内存中的位置放置随机值。这不是真的吗?很抱歉给您带来不便,但我对 c 很陌生。
    • 不,C 没有放入 any 值。这是不确定的。它可能每次都相同,也可能不同。
    • 它只是随机的,因为它是不可预测的
    • @klutt 谢谢。
    猜你喜欢
    • 2012-01-13
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多