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()
中声明的数组应超出作用域。为什么没有发生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的另一次调用会更改堆栈上的值?因为传递给函数的参数会被推送到堆栈中,局部变量也会从堆栈中分配。所以在返回指针时要小心并遵循我的建议。