函数返回类型作为指针,为什么不作为int,同时返回变量的地址

时间:2012-04-18 09:27:59

标签: c pointers

我的功能如下所示

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

编写与

相同的功能有什么问题
int foo() {
    int temp;
    return(&temp); //address of temp variable.
    }

因为“&” operator返回内存位置的地址,这是一个整数。

7 个答案:

答案 0 :(得分:1)

编译器没有数字逻辑。对于它,&temp是一个指针,只有temp是一个整数而是不同的类型,即使两者都是下面的数字流。

只有演员可以说服你的逻辑编译器。

这样的东西
return (int)&temp

答案 1 :(得分:1)

int *不是i​​nt,c是强类型语言。 你知道内存中的所有内容都可以作为数字读取,但你不能将所有内容解释为int。

BTW,返回一个本地(堆栈)变量的地址似乎没用。

答案 2 :(得分:0)

第一个例子将返回一个指向temp的指针(这没有意义,因为temp不在范围内,所以删除了)

第二个示例将temp的地址作为整数放在函数的返回值中,只有在出于某种目的打印地址值时才有效。

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

答案 3 :(得分:0)

这是事实,但编译器对表示地址的整数是严格的,并且它不会让你将它们视为整数。而是尝试return ((int)&temp);

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分: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;
}

现在,如果您将指针视为整数值,那么您希望所有这些打印语句都能看到相同的结果。但是,这是我系统上的输出:

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](10个元素的double数组)值的位置。

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

修改

记住别的东西;你将获得一个诊断,因为你试图将指针值转换为一个没有显式强制转换的整数,这是一个约束违规。章和节:

6.5.16.1简单分配

约束

1下列之一应成立: 96)

- 左操作数具有限定或非限定算术类型,右边具有 算术类型;

- 左操作数具有结构或联合类型的限定或非限定版本 兼容权利的类型;

- 两个操作数都是兼容类型的限定或非限定版本的指针, 并且左边指向的类型具有指向的类型的所有限定符 权;

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

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

- 左操作数的类型为_Bool,右边的是指针。

...
6.8.6.4退货声明
...
3如果执行带有表达式的return语句,则表达式的值为 作为函数调用表达式的值返回给调用者。如果表达式有 类型不同于它出现的函数的返回类型,值为 通过赋值给具有函数返回类型的对象进行转换。 139)