c语言中的奇怪行为

c语言中的奇怪行为,c,arrays,pointers,C,Arrays,Pointers,可能重复: 我最近遇到了以下代码: #include <stdio.h> int* abc () { int a[3] = {1,10,100}; return a; } int* xyz () { int b[1] = {222}; return b; } int main() { int *a, *b; a = abc(); b = xyz(); printf("%d\n", *a); return 0; } #包括 i

可能重复:

我最近遇到了以下代码:

#include <stdio.h>

int* abc () {
   int a[3] = {1,10,100};
   return a;
}
int* xyz () {
   int b[1] = {222};
   return b;
}
int main() {
   int *a, *b;
   a = abc();
   b = xyz();
   printf("%d\n", *a);
   return 0;
}
#包括
int*abc(){
int a[3]={1,10100};
返回a;
}
int*xyz(){
int b[1]={222};
返回b;
}
int main(){
int*a,*b;
a=abc();
b=xyz();
printf(“%d\n”,*a);
返回0;
}
输出为
222
<代码>'a'指向在
xyz()
中声明的数组

我的问题是:

  • 为什么在
    xyz()
    中声明了指向数组的

  • 函数执行后,函数
    xyz()
    中声明的数组应超出作用域。为什么没有发生

  • 您可能会看到222,因为在
    abc
    中用于本地数组的内存已被用于其他用途-函数
    xyz
    的堆栈。你在传递一个地址到那个存储器。再进行几个函数调用,
    *a
    可能包含一些其他值

    应在函数执行后超出范围。为什么没有发生

    变量已超出范围。在函数外部使用该地址是不正确的代码:使用指向函数返回的本地数据的指针是未定义的行为

    您可能会看到222,因为在
    abc
    中用于本地数组的内存已被用于其他用途-函数
    xyz
    的堆栈。你在传递一个地址到那个存储器。再进行几个函数调用,
    *a
    可能包含一些其他值

    应在函数执行后超出范围。为什么没有发生


    变量已超出范围。在函数外部使用该地址是不正确的代码:使用指向函数返回的本地数据的指针是未定义的行为

    变量
    a
    b
    是自动变量;在其他函数中使用它们的地址是一种未定义的行为。任何事情都可能发生:你不能期望输出(例如,优化编译器可以删除一些非法代码)。

    变量
    a
    b
    是自动变量;在其他函数中使用它们的地址是一种未定义的行为。任何事情都可能发生:您不能期望输出(例如,优化编译器可以删除一些非法代码)。

    2:它正在发生,并且整个程序都有未定义的行为。这不是一个正确的程序,思考“如果”和“但是”没有什么意义。

    2:它正在发生,整个程序都有未定义的行为。这不是一个正确的程序,思考“如果”和“但是”没有什么意义

    为什么没有发生

    它确实发生了,只是形式上的。未定义的行为不必崩溃或行为不端
    -它们“任何事情都可能发生”意味着它似乎也可以毫无错误地运行

    为什么没有发生


    它确实发生了,只是形式上的。未定义的行为不必崩溃或行为不端-它们“任何事情都可能发生”意味着它似乎也可以毫无错误地运行

    函数
    abc
    xyz
    都将地址传回本地创建的数组。随后的调用会将以前使用过(并传递回给您)的内存捣碎

    这些被称为自动局部变量


    您需要将这些数组声明为静态数组或以不同的方式分配内存。

    函数
    abc
    xyz
    都将一个地址传回本地创建的数组。随后的调用会将以前使用过(并传递回给您)的内存捣碎

    这些被称为自动局部变量


    您需要将这些数组声明为静态数组或以不同的方式分配内存。

    要返回指针,它必须是指向动态分配变量或静态或全局变量的指针

    返回一个指向堆栈变量的指针将使您拥有指向堆栈的指针,当您调用新方法时,该指针将被重用

    在您的情况下,将stack变量重新用于另一个数组,并覆盖调用第一个方法时存储的旧值


    再次尝试调用
    printf
    ,您将看到不同的输出,因为第一次调用printf更改了堆栈内容。

    要返回指针,它必须是指向动态分配变量或静态或全局变量的指针

    返回一个指向堆栈变量的指针将使您拥有指向堆栈的指针,当您调用新方法时,该指针将被重用

    在您的情况下,将stack变量重新用于另一个数组,并覆盖调用第一个方法时存储的旧值


    再次尝试调用
    printf
    ,您将看到不同的输出,因为第一次调用printf更改了堆栈内容。

    “为什么没有发生?”-您认为为什么没有发生?
    printf
    输出有误导性……“为什么没有发生?”-您认为为什么没有发生?
    printf
    输出有误导性……为什么对printf的另一次调用会更改堆栈上的值?因为传递给函数的参数会被推入堆栈,并且局部变量也会从堆栈中分配。因此,在返回指针时请小心并遵循我的建议。为什么对printf的另一次调用会更改堆栈上的值?因为传递给函数的参数会被推送到堆栈中,局部变量也会从堆栈中分配。所以在返回指针时要小心并遵循我的建议。