我的功能如下所示
int* foo() {
int temp;
return(&temp); //address of temp variable.
编写与
相同的功能有什么问题int foo() {
int temp;
return(&temp); //address of temp variable.
}
因为“&” operator返回内存位置的地址,这是一个整数。
答案 0 :(得分:1)
编译器没有数字逻辑。对于它,&temp
是一个指针,只有temp
是一个整数而是不同的类型,即使两者都是下面的数字流。
只有演员可以说服你的逻辑编译器。
像
这样的东西return (int)&temp
答案 1 :(得分:1)
int *不是int,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)