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)为什么不可以呢
请教,内存位置不就是地址吗? 变量的地址是个既存事实,你这种行为就跟想把1定义成2一样疯狂 &a不能是左值
lz还是看书去吧 &numbers得到的不是一个有效的左值,所以不能被赋值
你需要再学点基础知识
http://en.wikipedia.org/wiki/Value_%28computer_science%29
回 楼主(拜拜) 的帖子
风怒了…… 没人吐槽那个odd函数么 这代码看着不好吐槽啊,这个有点不合c语言的精神啊 没人吐槽返回栈地址吗 我本来不想看的看了2分钟,觉得思维已经进入八奇领域了。。。LZ得回炉重炼了
出了odd和odds与分号的问题之外
你最大的问题是那个function在return local variable的地址
好好想想当一个function call完后local variable会怎样吧 太多槽点。。。。不知如何吐起。。。。
我本来以为楼主的问题会和process对应的虚拟的内存地址和实际的物理内存地址有关。。。结果是这个。。。 改成 void odds(int* y) 一眼看下去怀疑这是不是c,拉到下面看回复觉得这应该是c,然后就无法吐槽了 现在还有个问题,关于函数里返回值,比如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);
}
数组变量里存的是首元素地址,相当于一个门牌号,局部变量返回以后就相当于拆迁了,你拿着个门牌号还有什么用
找本好点的书看看,别这么乱试了,这样写出来的东西就算能运行也奇葩得根本不能看 int *odds(void)
你函数返回的是一个数组,类似于指针,离开作用域就是销毁的
但static修饰后变成全局对象,作用域被扩大
如果你学的是C++,内置数组是不推荐用的
如果是C,那慢慢和这玩意打交道。。。 在之前已经很多人指出问题了,结果楼主13楼还是问了一遍,估计是没看懂别人说什么 如果返回的不是指针,那么就不算动态变量了?就不会销毁了对吗
比如这样,没加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);
}
内存位置就是地址,
但是栈上地址中的内容不是一直有效的,栈内存会在不同的函数间重用.
返回一个栈地址的通常后果就是得到一个指向无效内容的野指针(如果原内容物是对象的话,通常已经析构掉).
还没有理解指针的话,最好不要滥用这个玩意.个人估计90%的崩溃和bug都是指针带来的. 引用第17楼拜拜于2012-10-05 11:06发表的:
如果返回的不是指针,那么就不算动态变量了?就不会销毁了对吗
比如这样,没加static也没销毁,正常返回了x
#include <stdio.h>
....... images/back.gif
你返回的不是x,而是x的一个副本
函数的返回值用于初始化在调用函数处创建的临时对象。在求解表达式时,如果需要一个地方储存其运算结果,编译器会创建一个没有命名的对象,这就是临时对象。在英语中,C++ 程序员通常用 temporary 这个术语来代替 temporary object。
用函数返回值初始化临时对象与用实参初始化形参的方法是一样的。如果返回类型不是引用,在调用函数的地方会将函数返回值复制给临时对象。当函数返回非引用类型时,其返回值既可以是局部对象,也可以是求解表达式的结果。
页:
[1]