我正在刷新对C的记忆,我想测试指针。
我做了这个简单的程序,我在其中调用一个函数,该函数返回指向其参数中最大整数的指针
int*function_pointer (int a, int b, int c);
int main ()
{
printf("Testing pointers\n");// line 1
int*pointer = pointer_function(10,12,36);
//pointer_function(10,102,36) is assigned to int*pointer
printf("Okay, what now...\n");//line 3
return 0;
}
指针功能
int*function_pointer (int a, int b, int c)
{
int x;
int*ptr = &x;
//initially ptr points to the address of x
if(a > b)
{
if(a > c)
{
printf("a is the greatest\n);
ptr = &a;
}
}
if(b > a)
{
if(b > c)
{
printf("b is the greatest\n");
ptr = &b;
//b is 102, so in this scope ptr points to the address of b
}
}
if(c > a)
{
if(c > b)
{
printf("c is the greatest\n");
ptr = &c;
}
}
return ptr;
//function returns the value of ptr which is the address of b
}
function_pointer(10,102,36)
中的function_pointer(...)
内,为该范围创建了int a, b, c
ptr = &x
b = 102
,ptr = &b
pointer = ptr
,因此pointer = &b
b
超出范围,且没有任何内容*pointer = 102
,不应该返回垃圾值,因为b没有主函数的范围答案 0 :(得分:1)
但是b超出了范围,并且没有任何内容
您的指针在技术上仍然有效,它只指向内存区域。它是你的情况,当function_pointer()
返回b
仍指向它用于本地变量的内存时(因此,在你的堆栈中)。你不应该再使用内存了,但是当你的指针指向的内存内容默认情况下不再使用时会被归零,那么你很幸运还有以前的内存值102
仍然存在,因为您的堆栈扩展时间不超过自function_pointer()
以来返回的内容,因为没有其他代码需要这样做。
如果您想进行某些测试,可能需要创建另一个在function_pointer()
之后调用的函数。如果你需要新的函数局部变量(即150 int
s的数组)。使您的代码使用更多堆栈并覆盖剩余部分。然后你将不再看到102
。