傻瓜的指针

时间:2014-10-24 13:03:10

标签: c function pointers

我刚学过指针,我写了一个非常简单的程序来检查我理解的是否正确;我的想法是创建一个简单的函数,它将输入作为整数值并返回其地址。

即使这应该是地球上最简单的事情,我在编制后会收到一条警告信息,但我不知道为什么......

#include <stdio.h>
#include <stdlib.h>

// returnType functionName(type arg1, type arg2)
int* return_me(int);

int main(){
    int  x = 1;
    int *p;

    p = &x;
    printf("p: %p\n", p);

    p = return_me(x);
    printf("p: %p\n", p);

    return 0;
}

int* return_me(int num){
     return &num;
}

我应该得到相同的结果,但我不知道......我在哪里弄乱?

这是警告:

pointers.c: In function ‘return_me’:
pointers.c:21:2: warning: function returns address of local variable [-Wreturn-local-addr]
return &num;

5 个答案:

答案 0 :(得分:8)

该行

p = return_me(x);

x的值分配给函数中的变量num,类似于:

int num = x ;
p = &num ;

num是一个不同的变量,并且具有不同的地址。

另请注意,当您从函数返回其地址时,本地变量num不再存在,并且未真正定义打印其地址。


像这样:

int* return_me( int* pnum )
{
     printf("%d" , *pnum ) ;
     return pnum ;
}

答案 1 :(得分:1)

问题是c中的参数总是按值复制。 因此,您只能实例化一个新的int并将值复制到它num

int x = 1;       // i is an int
int* p = &x;    // pi is a pointer to an int

return_me(x)     // here you pass the integers value as "copy by value"

内部return_me()

int* return_me(int num){    // here you instantiate a new int "num" and copy the value from "i" to it.
     return &num;           // therefore you have a new Int and a new a new address which is different from "i" outside this func
}

答案 2 :(得分:0)

当您将一个整数作为x传递给函数时,该函数不会获取x所在的地址。相反,它只是访问其价值。编译器通常通过将其值分配给某个寄存器或通过将其推送到堆栈来传递此值。无论哪种方式,被调用的函数都不能对其位置做出任何假设。相反,它只能使用其VALUE。如果和某个函数需要知道某个变量的地址,通常是因为它是一个OUT参数,这意味着被调用的函数应该操纵该值,并将其投射回调用函数,在这种情况下,调用函数应该改为传递一个指向该变量的指针,而不是它的值。

答案 3 :(得分:0)

你不能在C中找到任何随机整数的地址而不使用&#39;&amp;&#34;运营商。 您尝试实施的功能由&#39;&amp;&#39;运营商本身。 所以你应该读一下&amp;运算符及其在C中的实现方式。

答案 4 :(得分:0)

我在这里重写了你的代码。有一点修改。

#include <stdio.h>
#include <stdlib.h>

// returnType functionName(type arg1, type arg2)
int* return_me(int*);

int main(){
int  x = 1;
int *p;

p = &x;
printf("p: %p\n", p);

p = return_me(&x);
printf("p: %p\n", p);

return 0;
}

int *return_me(int *num){
 return num;
}

在我的系统上执行上述代码时,我得到了以下outpu

p: 0x7fff4e0305ec
p: 0x7fff4e0305ec

有图画表示

  X         P        num
+----+    +----+    +----+
| 1  |    |1000|    |1000|
+----+    +----+    +----+
 1000      2000      3000
Fig: 1a,1b,1c respectively.

代码

int x=1;

参见图1a。

代码

p=&x;

参见图1b。

守则

int *return_me(int *num){

其中num保持图1c中所示的值。

同样的值也返回给main函数。

您的代码存在的问题是,您使用的是变量x的副本(即按值调用),而不是变量x的实际地址(使用引用调用完成)。 当你发送x的copie时,变量的生命周期将在声明它的函数中。在你的情况下,当控制离开函数时,变量的寿命被认为是死的(即main())。