拜拜 发表于 2012-10-4 06:51

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


#include <stdio.h>
#define SIZE 5
int *odd(void);
int main()
{
int numbers;
int x;
&numbers = odds();
for(x=0; x<SIZE; x++)
    printf("Element #%d = %d\n", x, numbers);
return(0);
}

int *odds(void)
{
int y;
int x;
for(x=0; x<SIZE; x++)
    y = 2*x+1;
return(y)
}


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

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

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

zatsuza 发表于 2012-10-4 11:39

变量的地址是个既存事实,你这种行为就跟想把1定义成2一样疯狂

tsubasa9 发表于 2012-10-4 11:54

&a不能是左值
lz还是看书去吧

dazzle 发表于 2012-10-4 11:56

&numbers得到的不是一个有效的左值,所以不能被赋值
你需要再学点基础知识
http://en.wikipedia.org/wiki/Value_%28computer_science%29

dazzle 发表于 2012-10-4 11:56

回 楼主(拜拜) 的帖子

风怒了……

shinzero 发表于 2012-10-4 12:25

没人吐槽那个odd函数么

f3uki 发表于 2012-10-4 12:27

这代码看着不好吐槽啊,这个有点不合c语言的精神啊

danying555 发表于 2012-10-4 12:35

gawain 发表于 2012-10-4 12:38

没人吐槽返回栈地址吗

runawaycat 发表于 2012-10-4 12:46

我本来不想看的
看了2分钟,觉得思维已经进入八奇领域了。。。LZ得回炉重炼了
出了odd和odds与分号的问题之外
你最大的问题是那个function在return local variable的地址
好好想想当一个function call完后local variable会怎样吧

mimighost 发表于 2012-10-4 12:57

太多槽点。。。。不知如何吐起。。。。

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

星空天神 发表于 2012-10-4 23:16

改成 void odds(int* y)

real_zyf 发表于 2012-10-5 00:59

一眼看下去怀疑这是不是c,拉到下面看回复觉得这应该是c,然后就无法吐槽了

拜拜 发表于 2012-10-5 08:16

现在还有个问题,关于函数里返回值,比如int lala=1; return(lala);就没问题,这叫什么,因为是地址常量?

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

bug修复

#include <stdio.h>

#define SIZE 5

int *odds(void);

int main()
{
    int *num;
    int x;

    num = odds();
    for(x=0; x<SIZE; x++)
      printf("Element #%d = %d\\n", x, *(num+x));
    return(0);
}

int *odds(void)
{
    static int y;
    int x;
    for(x=0; x<SIZE; x++)
      y = 2*x+1;
    return(y);
}

dazzle 发表于 2012-10-5 08:49

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

endrollex 发表于 2012-10-5 09:15

int *odds(void)
你函数返回的是一个数组,类似于指针,离开作用域就是销毁的
但static修饰后变成全局对象,作用域被扩大

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

dennisyy 发表于 2012-10-5 09:45

在之前已经很多人指出问题了,结果楼主13楼还是问了一遍,估计是没看懂别人说什么

拜拜 发表于 2012-10-5 11:06

如果返回的不是指针,那么就不算动态变量了?就不会销毁了对吗

比如这样,没加static也没销毁,正常返回了x

#include <stdio.h>
int strlength(char *string);
int main()
{
char input;
int len;

printf("I love S1:");
gets(input);
len = strlength(input);
printf("That text is %d characters long.\\n", len);
return(0);
}

int strlength(char *string)
{
int x = 0;

while(*string)
{
x++;
string++;
}
return(x);
}

HMHM 发表于 2012-10-5 13:21

内存位置就是地址,
但是栈上地址中的内容不是一直有效的,栈内存会在不同的函数间重用.
返回一个栈地址的通常后果就是得到一个指向无效内容的野指针(如果原内容物是对象的话,通常已经析构掉).

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

海哲风 发表于 2012-10-5 15:09

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

比如这样,没加static也没销毁,正常返回了x

#include <stdio.h>
....... images/back.gif

你返回的不是x,而是x的一个副本

函数的返回值用于初始化在调用函数处创建的临时对象。在求解表达式时,如果需要一个地方储存其运算结果,编译器会创建一个没有命名的对象,这就是临时对象。在英语中,C++ 程序员通常用 temporary 这个术语来代替 temporary object。

用函数返回值初始化临时对象与用实参初始化形参的方法是一样的。如果返回类型不是引用,在调用函数的地方会将函数返回值复制给临时对象。当函数返回非引用类型时,其返回值既可以是局部对象,也可以是求解表达式的结果。
页: [1]
查看完整版本: bug修复,怎么判断地址常量?内存位置和地址有什么区别?