c - C 中的这两个简单代码是相同的,但我得到不同的输出。会喜欢一些内省(introspection)

标签 c

C 中的这两个简单代码是相同的,但我得到不同的输出。会喜欢一些反省

第一个代码的输出是正确的,这是我所期待的,只是我不明白为什么输出会通过注释 printf 语句而改变,但这很简单,即使在调试之后我也不明白其中的逻辑,两个代码中的输出应该相同,因为它们是相同的,任何关于从函数返回数组到 main 然后打印这些数组的帮助都会帮助我。

#include <stdio.h>

int* func ()
{
    int a[3] = { 1, 2, 3};
    printf ("size: %d\n", sizeof(a[2]));
    return a;
}

int main()
{
    int *b, c, i;

    b = func ();

    for (i=0; i<3; i++)
    {
        printf ("%d\n", *b + i);
    }

    return 0;
}

输出: 尺寸:4

1

2

3

#include <stdio.h>

int* func ()
{
    int a[3] = { 1, 2, 3};
    //printf ("size: %d\n", sizeof(a[2]));
    return a;
}

int main()
{
    int *b, c, i;

    b = func ();

    for (i=0; i<3; i++)
    {
        printf ("%d\n", *b + i);
    }

    return 0;
}

输出: 1

1962249430

1962249431

最佳答案

此代码表现出未定义的行为。函数 func 正在返回局部变量 a 的地址,该地址在函数返回后立即超出范围。然后这个不再有效的地址在 main 中被取消引用,导致意外的事情发生。

关于c - C 中的这两个简单代码是相同的,但我得到不同的输出。会喜欢一些内省(introspection),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35946357/

相关文章:

C - 添加二维字符数组的元素

C 指针和内存 - 理解

c++ - CPP预处理器到C预处理器的转换问题

c - gcc -fstack-protector 不会抛出错误

C函数在不指定参数数据类型的情况下工作

Cmake 交叉编译导致 arm-none-eabi-gcc 测试失败

c - 使用宏 STATIC 的重要性

c - 用 C 链接到一个特定的库

c - Malloc 或普通数组定义?

c - SDDC 将文字值转换为 'generic' 指针