奇怪,为什么指针地址会改变了?(请教)
qnnui
奇怪,为什么指针地址会改变了?(请教)
比如如下程序实行时:
int main() {
SQLDA *pda;
...... // 这里有一系列处理
printf("%p", pda); // 此时该指针地址为435984
dataExc(pda);
printf("%p", pda); // 此时该指针地址变为了202020. 在dataExc中还是435984的呀,为什么这里会变了呢?
}
int dataExc(SQLDA *pda) {
...... // 这里有一系列处理
printf("%p", pda); // 此时该指针地址仍然为435984
return 0;
}
net_robber
你确定dataExc的定义是
int dataExc(SQLDA *pda)
而不是
int dataExc(SQLDA &pda)
scutan
程序不会出错, 出错的是人, 好好检查一下.
思一克
第二个
...... // 这里有一系列处理
处理出问题的.
思一克
flw, LZ是真的, 没有骗人.
你仔细想想
[quote]原帖由 [i]flw[/i] 于 2008-6-25 22:02 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8663001&ptid=1170713][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
楼主在骗人。 [/quote]
cjaizss
C++?用了引用
如果是C语言,那么只能解释成存在越界访问了.
scutan
回复 #8 cjaizss 的帖子
嗯. 我也怀疑是缓冲区溢出, 不过楼主再来详细说明一下才好, 不然又成了大家在这乱猜的局面了.
思一克
我好多年前出过"思一克小测验题", 意思和这个是一样的:
用C.
[CODE]
#include <stdio.h>;
void func(int i)
{
????????
printf("i1 = %d/n", i);
}
main()
{
int i = 59;
printf("i0 = %d/n", i);
func(i);
printf("i2 = %d/n", i);
}
[/CODE]
要求写出???????出的代码, 使得程序打印结果为:
i0 = 59
i1 = 59
i2 = 43
flw
[quote]原帖由 [i]思一克[/i] 于 2008-6-25 22:03 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8663011&ptid=1170713][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
flw, LZ是真的, 没有骗人.
你仔细想想 [/quote]
嗯,确实是有可能的。
形参和实参是两个实体。
[[i] 本帖最后由 flw 于 2008-6-25 22:24 编辑 [/i]]
scutan
回复 #10 思一克 的帖子
嗯, 通过func()中 i 的变量的地址再加一个变量可以得到main中 i 的变量的地址, 再改之, 不过和编译器相关.
思一克
flw,
LZ出错误, 造成我我10楼题目的答案. 所以就出现那情况了.
flw
[quote]原帖由 [i]思一克[/i] 于 2008-6-25 22:24 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8663179&ptid=1170713][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
flw,
LZ出错误, 造成我我10楼题目的答案. 所以就出现那情况了. [/quote]
对的。确实是这样。
思一克
记得原来题目有答案(找不到了,或没有必要找了),
很简单的几行代码. 和编译基本无关, 在好几个(包括VC)都一样. 关键是不加固定OFFSET, 而是查找59.
[quote]原帖由 [i]scutan[/i] 于 2008-6-25 22:23 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8663168&ptid=1170713][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
嗯, 通过func()中 i 的变量的地址再加一个变量可以得到main中 i 的变量的地址, 再改之, 不过和编译器相关. [/quote]
cjaizss
[quote]原帖由 [i]思一克[/i] 于 2008-6-25 22:14 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8663086&ptid=1170713][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
我好多年前出过"思一克小测验题", 意思和这个是一样的:
用C.
#include ;
void func(int i)
{
????????
printf("i1 = %d/n", i);
}
main()
{
int i = 59;
printf("i ... [/quote]
[code]
linux-0gt0:/tmp/ch/a2/verilog # cat 2.c
#include <stdio.h>
void func(int i)
{
*(&i+8)=43;
printf("i1 = %d/n", i);
}
main()
{
int i = 59;
printf("i0 = %d/n", i);
func(i);
printf("i2 = %d/n", i);
}
linux-0gt0:/tmp/ch/a2/verilog # gcc 2.c && ./a.out
i0 = 59
i1 = 59
i2 = 43
[/code]
思一克
cj,
你可以在FUNC中从i地址的下一个开始查找59(找10次), 然后改变那个.
就不用加固定的8了.
jigloo
咦, 楼上这办法不错。就像FPE和金山游侠。
scutan
回复 #17 思一克 的帖子
明白了.
[CODE]
#include<stdio.h>
void func(int i)
{
int j;
for (j = 2; j <= 200; j++)
{
if ((*(&i + j)) == 59)
{
*(&i + j) = 43;
break;
}
}
printf("i1=%d/n", i);
}
int main()
{
int i = 59;
printf("i0=%d/n", i);
func(i);
printf("i2=%d/n", i);
return 0;
}
[/CODE]
scutan
如果加了
printf("i0=%d/n", i);
这一行的话 *(&i+1) 的值也为59. 所以从j=2开始往上面找.