C 什么';s函数调用的返回值,如果该函数不';我真的不能提供一个

C 什么';s函数调用的返回值,如果该函数不';我真的不能提供一个,c,stack-frame,C,Stack Frame,假设我们有以下代码: int func(char str[], int len) { // Don't return anything here. } int main() { char str[] = "Hello"; int result = func(str, strlen(str)); printf("%d\n", result); } 它将在我的计算机上打印一些字符串值-1679929632。当我执行时,它会时不时地变化 有人能解释为什么会发生这种情

假设我们有以下代码:

int func(char str[], int len) {
    // Don't return anything here.
}

int main() {
    char str[] = "Hello";
    int result = func(str, strlen(str));
    printf("%d\n", result);
}
它将在我的计算机上打印一些字符串值-1679929632。当我执行时,它会时不时地变化


有人能解释为什么会发生这种情况吗?

如果函数定义中没有返回语句,则在执行被调用函数的最后一条语句后,控件会自动返回调用函数。在这种情况下,被调用函数的返回值为。如果不需要返回值,则将函数声明为void return type;否则,默认返回类型为int


如上所述,其未定义,因此在一些随机值后面查找返回的根本原因将是无用的。

如果函数定义中没有出现返回语句,则在执行被调用函数的最后一条语句后,控件将自动返回到调用函数。在这种情况下,被调用函数的返回值为。如果不需要返回值,则将函数声明为void return type;否则,默认返回类型为int


如上所述,它是未定义的,因此在一些随机值(如返回值)后面查找根本原因将是无用的。

这是未定义的行为。它可能是任何东西或崩溃。此值是否从StackFrame读取?它的潜在价值是什么?某些局部变量或返回地址?这可能有助于您理解:该值通常是用于返回该类型值的寄存器中发生的任何值。因此,基本上,调用者只是尝试读取一些寄存器作为返回值,而调用者不知道被调用者是否真的返回了某个值。对吧?这是未定义的行为。它可能是任何东西或崩溃。此值是否从StackFrame读取?它的潜在价值是什么?某些局部变量或返回地址?这可能有助于您理解:该值通常是用于返回该类型值的寄存器中发生的任何值。因此,基本上,调用者只是尝试读取一些寄存器作为返回值,而调用者不知道被调用者是否真的返回了某个值。对吗?