找回密码
 立即注册
搜索
查看: 1810|回复: 19

[其他] bug修复,怎么判断地址常量?内存位置和地址有什么区别?

[复制链接]
     
发表于 2012-10-4 06:51 | 显示全部楼层 |阅读模式
  1. #include <stdio.h>
  2. #define SIZE 5
  3. int *odd(void);
  4. int main()
  5. {
  6. int numbers[SIZE];
  7. int x;
  8. &numbers = odds();
  9. for(x=0; x<SIZE; x++)
  10.     printf("Element #%d = %d\n", x, numbers[x]);
  11. return(0);
  12. }
  13. int *odds(void)
  14. {
  15. int y[SIZE];
  16. int x;
  17. for(x=0; x<SIZE; x++)
  18.     y[x] = 2*x+1;
  19. return(y)
  20. }
复制代码

以上代码的问题主要是&numbers = odds();

odds()返回的是内存位置(memory location),而&numbers获取地址(address)为什么不可以呢

请教,内存位置不就是地址吗?
回复

使用道具 举报

发表于 2012-10-4 11:39 | 显示全部楼层
变量的地址是个既存事实,你这种行为就跟想把1定义成2一样疯狂
回复

使用道具 举报

发表于 2012-10-4 11:54 | 显示全部楼层
&a不能是左值
lz还是看书去吧
回复

使用道具 举报

发表于 2012-10-4 11:56 | 显示全部楼层
&numbers得到的不是一个有效的左值,所以不能被赋值
你需要再学点基础知识
http://en.wikipedia.org/wiki/Value_%28computer_science%29
回复

使用道具 举报

发表于 2012-10-4 11:56 | 显示全部楼层

回 楼主(拜拜) 的帖子

风怒了……
回复

使用道具 举报

     
发表于 2012-10-4 12:25 | 显示全部楼层
没人吐槽那个odd函数么
回复

使用道具 举报

     
发表于 2012-10-4 12:27 | 显示全部楼层
这代码看着不好吐槽啊,这个有点不合c语言的精神啊
回复

使用道具 举报

头像被屏蔽
     
发表于 2012-10-4 12:35 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2012-10-4 12:38 | 显示全部楼层
没人吐槽返回栈地址吗
回复

使用道具 举报

发表于 2012-10-4 12:46 | 显示全部楼层
我本来不想看的
看了2分钟,觉得思维已经进入八奇领域了。。。LZ得回炉重炼了
出了odd和odds与分号的问题之外
你最大的问题是那个function在return local variable的地址
好好想想当一个function call完后local variable会怎样吧
回复

使用道具 举报

发表于 2012-10-4 12:57 | 显示全部楼层
太多槽点。。。。不知如何吐起。。。。

我本来以为楼主的问题会和process对应的虚拟的内存地址和实际的物理内存地址有关。。。结果是这个。。。
回复

使用道具 举报

     
发表于 2012-10-4 23:16 | 显示全部楼层
改成 void odds(int* y)
回复

使用道具 举报

     
发表于 2012-10-5 00:59 | 显示全部楼层
一眼看下去怀疑这是不是c,拉到下面看回复觉得这应该是c,然后就无法吐槽了
回复

使用道具 举报

     
 楼主| 发表于 2012-10-5 08:16 | 显示全部楼层
现在还有个问题,关于函数里返回值,比如int lala=1; return(lala);就没问题,这叫什么,因为是地址常量?

然而,int lala[1]={1};return(lala);却不行,说要销毁,必须要加static,难道说数组就一定是动态的?其他的都算常量?是不是?

bug修复
  1. #include <stdio.h>
  2. #define SIZE 5
  3. int *odds(void);
  4. int main()
  5. {
  6.     int *num;
  7.     int x;
  8.     num = odds();
  9.     for(x=0; x<SIZE; x++)
  10.         printf("Element #%d = %d\\n", x, *(num+x));
  11.     return(0);
  12. }
  13. int *odds(void)
  14. {
  15.     static int y[SIZE];
  16.     int x;
  17.     for(x=0; x<SIZE; x++)
  18.         y[x] = 2*x+1;
  19.     return(y);
  20. }
复制代码
回复

使用道具 举报

发表于 2012-10-5 08:49 | 显示全部楼层
数组变量里存的是首元素地址,相当于一个门牌号,局部变量返回以后就相当于拆迁了,你拿着个门牌号还有什么用
找本好点的书看看,别这么乱试了,这样写出来的东西就算能运行也奇葩得根本不能看
回复

使用道具 举报

     
发表于 2012-10-5 09:15 | 显示全部楼层
int *odds(void)
你函数返回的是一个数组,类似于指针,离开作用域就是销毁的
但static修饰后变成全局对象,作用域被扩大

如果你学的是C++,内置数组是不推荐用的
如果是C,那慢慢和这玩意打交道。。。
回复

使用道具 举报

     
发表于 2012-10-5 09:45 | 显示全部楼层
在之前已经很多人指出问题了,结果楼主13楼还是问了一遍,估计是没看懂别人说什么
回复

使用道具 举报

     
 楼主| 发表于 2012-10-5 11:06 | 显示全部楼层
如果返回的不是指针,那么就不算动态变量了?就不会销毁了对吗

比如这样,没加static也没销毁,正常返回了x
  1. #include <stdio.h>
  2. int strlength(char *string);
  3. int main()
  4. {
  5. char input[64];
  6. int len;
  7. printf("I love S1:");
  8. gets(input);
  9. len = strlength(input);
  10. printf("That text is %d characters long.\\n", len);
  11. return(0);
  12. }
  13. int strlength(char *string)
  14. {
  15. int x = 0;
  16. while(*string)
  17. {
  18. x++;
  19. string++;
  20. }
  21. return(x);
  22. }
复制代码
回复

使用道具 举报

     
发表于 2012-10-5 13:21 | 显示全部楼层
内存位置就是地址,
但是栈上地址中的内容不是一直有效的,栈内存会在不同的函数间重用.
返回一个栈地址的通常后果就是得到一个指向无效内容的野指针(如果原内容物是对象的话,通常已经析构掉).

还没有理解指针的话,最好不要滥用这个玩意.个人估计90%的崩溃和bug都是指针带来的.
回复

使用道具 举报

发表于 2012-10-5 15:09 | 显示全部楼层
引用第17楼拜拜于2012-10-05 11:06发表的  :
如果返回的不是指针,那么就不算动态变量了?就不会销毁了对吗

比如这样,没加static也没销毁,正常返回了x
[code]
#include <stdio.h>
.......
你返回的不是x,而是x的一个副本
函数的返回值用于初始化在调用函数处创建的临时对象。在求解表达式时,如果需要一个地方储存其运算结果,编译器会创建一个没有命名的对象,这就是临时对象。在英语中,C++ 程序员通常用 temporary 这个术语来代替 temporary object。

用函数返回值初始化临时对象与用实参初始化形参的方法是一样的。如果返回类型不是引用,在调用函数的地方会将函数返回值复制给临时对象。当函数返回非引用类型时,其返回值既可以是局部对象,也可以是求解表达式的结果。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2025-9-13 13:57 , Processed in 0.171245 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表