奇怪,为什么指针地址会改变了?(请教)

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;
}

Kevin_zqw
不解

net_robber
你确定dataExc的定义是
int dataExc(SQLDA *pda)
而不是
int dataExc(SQLDA &pda)

scutan
程序不会出错, 出错的是人, 好好检查一下.

思一克
第二个


......  // 这里有一系列处理


处理出问题的.

flw
楼主在骗人。

思一克
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开始往上面找.