2012-04-18 64 views
0

上午有功能的ADRESS如下函数返回类型为指针,为什么不是如int,而返回变量

int* foo() { 
int temp; 
return(&temp); //address of temp variable. 

给出的什么是错的书面相同的功能,

int foo() { 
    int temp; 
    return(&temp); //address of temp variable. 
    } 

因为“&”运算符返回整数存储单元的地址。

+0

你为什么要返回一个临时地址? – killogre 2012-04-18 09:30:41

+1

你想用这样的功能来完成什么?没有一个看起来真的*对*,因为你返回一个临时变量的地址,一旦函数完成就会被销毁。 – penelope 2012-04-18 09:30:51

+8

内存位置的地址**不是** int或任何其他整数类型。 – pmg 2012-04-18 09:32:54

回答

1

编译器不通过编号逻辑去。对于它而言,&temp是一个指针,只是temp是一个整数,而是不同的类型即使它们都是下面的数字流。

只有一个强制转换才能说服你的逻辑编译器。

喜欢的东西

return (int)&temp 
0

第一个例子将返回一个指针临时(这将没有任何意义,因为温度超出范围的,因此移除)

第二个例子将临时放置的地址为一个整数函数的返回值,如果您希望为某些目的而打印地址值,那么该函数就很有用。

所以写第二个例子是错误的,因为那么你需要将int转换为int *来使它像指针一样工作。

+0

OP的问题是别的 – 2012-04-18 09:44:04

0

这是真的,但编译器对表示地址的整数是严格的,它不会让你把它们当作整数来对待。而不是尝试return ((int)&temp);

1

INT *不int和c是强类型语言。 你知道内存中的所有内容都可以作为数字来读取,但是你不能把所有东西都解释为int。

顺便说一句,返回本地(堆栈)变量的地址似乎没用。

+1

它唯一有用的时间是收集PRNG种子或类似的熵,即使如此,您也需要将它与其他方法混合使用,因为它可能没有太多/任何熵内容,具体取决于使用情况案例和操作系统。 – 2012-04-18 14:36:57

0

由于您返回本地变量的地址,因此您给它们的这两个函数根本上都是错误的。这样的地址一旦完成你的功能的执行就无效了。只是不这样做,这是未定义的行为,如果您尝试访问该对象,任何事情都可能发生。

0

int(整数类型)和int *(地址)都是整数值,但可以是不同的大小。说如果int占用内存中的一个字节,并且如果我们返回一个32位地址,则会有内存溢出。

0

因为指针值是而不是只是一个整数。是的,您可以返回指针值的整数表示,但这与返回指针不同,因为整数和指针的语义不同。例如,您不能取消引用整数类型,并且指针算术与整数算术不同。

例如,利用这个程序(编译为C99):

#include <stdio.h> 

int main(void) 
{ 
    int  x  = 0; 
    char *cp  = 0; 
    int  *ip  = 0; 
    double (*ap)[10] = 0; 

    printf("sizeof x = %zu, x = %d, x + 1 = %d\n", sizeof x, x, x + 1); 
    printf("sizeof cp = %zu, cp = %d, cp + 1 = %d\n", sizeof cp, (int) cp, (int) (cp + 1)); 
    printf("sizeof ip = %zu, ip = %d, ip + 1 = %d\n", sizeof ip, (int) ip, (int) (ip + 1)); 
    printf("sizeof ap = %zu, ap = %d, ap + 1 = %d\n", sizeof ap, (int) ap, (int) (ap + 1)); 

    return 0; 
} 

现在,如果你觉得指针刚刚整数值,你希望看到同样的结果,所有这些print语句。但是,这是我的系统上的输出:

sizeof x = 4, x = 0, x + 1 = 1 
sizeof cp = 4, cp = 0, cp + 1 = 1 
sizeof ip = 4, ip = 0, ip + 1 = 4 
sizeof ap = 4, ap = 0, ap + 1 = 80 

即使所有指针都具有相同的尺寸和代表的整数(至少在我的系统),增加1至每个指针值的结果给了我基于指针类型的不同结果。 cp + 1会给我下char值的位置,而ip + 1会给我下int值的位置,并ap + 1会给我值的下一double [10]double 10元件阵列)的位置。

更不用说这两个例子的逻辑都是有缺陷的;当您从该函数返回时,temp不再存在,并且您返回的指针值不再有效。

编辑

只是想起别的东西;你会得到一个诊断,因为你试图将一个指针值转换为一个整数而没有显式强制转换,这是违反约束的。引经据典:

6.5.16.1简单赋值

约束

1下列情况之一的应持有: 96)

- 左操作有合格或不合格的算术类型右边有 算术类型;

- 左边的操作数有一个结构或联合类型的合格或不合格版本 与右边的类型兼容;

- 两个操作数都是指向兼容类型的合格或非限定版本的指针, ,左侧指向的类型具有 右侧指向的所有类型的限定符;

- 一个操作数是指向一个对象或不完整类型的指针,另一个是指向合格或不合格版本的void的指针,左边指向的类型全部为 指向的类型限定符正确的;

- 左操作数是一个指针,右边是一个空指针常量;或

- 左操作数具有类型_Bool,右边是一个指针。

...
6.8.6.4 return语句
...
3如果执行与表达return语句,表达式的值是 返回给调用者的值了函数调用表达式。如果表达式的 类型与其出现的函数的返回类型不同,则该值为 ,就好像通过赋值给具有函数返回类型的对象一样。 139)
+0

http://ideone.com/RlYwQ – 2012-04-18 12:08:23

+1

而且?如果你把一个指针值赋给一个'int',你会得到一个'int'值。这没有争议。问题在于指针与整数相同的概念,这是不正确的。 – 2012-04-18 14:45:57

相关问题