对 return C 中的指针时的安全问题感到困惑
Confused about the safety issue when return a pointer in C
我知道C是按值传递的。所以我认为每次调用函数时 a 和 b 的地址可能不同,但我不确定....我说得对吗?
举个例子:
int *x = i(1, 0);
printf("%d\n", *x);
这会调用未定义的行为,因为函数参数具有自动存储持续时间,并且在函数 returns.
时被丢弃
在函数 i
内,a
和 b
对象是函数的局部对象,它们的生命周期在函数 returns.
时结束
是的,它们可能不同。尝试做一些实验。
#include <stdio.h>
int *i(int a, int b) {
if (a > b)
return &a;
else return &b;
}
void test(void) {
printf("%p\n", (void*)i(1, 0));
}
int main(void) {
printf("%p\n", (void*)i(1, 0));
test();
return 0;
}
注意:不要取消引用返回的指针,因为它们指向的内容在从函数返回时已经消失。
我知道C是按值传递的。所以我认为每次调用函数时 a 和 b 的地址可能不同,但我不确定....我说得对吗?
举个例子:
int *x = i(1, 0);
printf("%d\n", *x);
这会调用未定义的行为,因为函数参数具有自动存储持续时间,并且在函数 returns.
时被丢弃在函数 i
内,a
和 b
对象是函数的局部对象,它们的生命周期在函数 returns.
是的,它们可能不同。尝试做一些实验。
#include <stdio.h>
int *i(int a, int b) {
if (a > b)
return &a;
else return &b;
}
void test(void) {
printf("%p\n", (void*)i(1, 0));
}
int main(void) {
printf("%p\n", (void*)i(1, 0));
test();
return 0;
}
注意:不要取消引用返回的指针,因为它们指向的内容在从函数返回时已经消失。