user-0 提问:  64位机器传指针的问题

回复:
user: user-1
content: 写了个测试程序没有这个问题，楼主贴下调试信息

user: user-2
content: 楼主能否实例化一下你的代码，或者自己设置断点跟踪，找到被改写的代码位置。

user: user-3
content: 怎么找到溢出的。我两次fun1(char c[]);func2(char c[]).gdb查看第二次的时候越界0x01，第一次bt地址正常。

user: user-4
content: 引用 15 楼 MarcoReus 的回复:[quote=引用 13 楼 nadleeh123 的回复:] [quote=引用 3 楼 MarcoReus 的回复:] 代码是这样的 float Treesimilarity(CSNode * node,CSNode * rightnode) { 	char c[2048]={0}; 	char d[2048]={0}; 	float result=0; 	Treetraverse(node,c); 	Treetraverse(rightnode,d); 	result = Findlcs(c,d); 	return result; } c和d穿进去之后值就会改变。 float Findlcs(char *a,char *b) 这个函数的生面是上面这样  你那4K的栈确定能够不溢出？[/quote] 的确是栈溢出了，越到下个函数的栈空间了，该如何解决啊[/quote] 用malloc函数来申请空间 大量连续的栈空间，对代码的移植性并不好。

user: user-5
content: 6楼正解！但楼主视而不见，怨不得别人。

user: user-0
content: 引用 14 楼 darknightghost 的回复:你的程序是不是哪里发生栈溢出了?栈溢出会导致一些东西被莫名其妙的改变,还不容易调试出来. 是的，不过该怎么解决啊····求教啊

user: user-0
content: 引用 13 楼 nadleeh123 的回复:[quote=引用 3 楼 MarcoReus 的回复:] 代码是这样的 float Treesimilarity(CSNode * node,CSNode * rightnode) { 	char c[2048]={0}; 	char d[2048]={0}; 	float result=0; 	Treetraverse(node,c); 	Treetraverse(rightnode,d); 	result = Findlcs(c,d); 	return result; } c和d穿进去之后值就会改变。 float Findlcs(char *a,char *b) 这个函数的生面是上面这样  你那4K的栈确定能够不溢出？[/quote] 的确是栈溢出了，越到下个函数的栈空间了，该如何解决啊

user: user-6
content: 我也是64位机器 没遇到你说的情况。你可以目标平台改一下试试，如果不是非要限制在x64下。

user: user-7
content: 你的程序是不是哪里发生栈溢出了?栈溢出会导致一些东西被莫名其妙的改变,还不容易调试出来.

user: user-4
content: 引用 3 楼 MarcoReus 的回复:代码是这样的 float Treesimilarity(CSNode * node,CSNode * rightnode) { 	char c[2048]={0}; 	char d[2048]={0}; 	float result=0; 	Treetraverse(node,c); 	Treetraverse(rightnode,d); 	result = Findlcs(c,d); 	return result; } c和d穿进去之后值就会改变。 float Findlcs(char *a,char *b) 这个函数的生面是上面这样  你那4K的栈确定能够不溢出？

user: user-8
content: 引用 3 楼 MarcoReus 的回复:代码是这样的 float Treesimilarity(CSNode * node,CSNode * rightnode) { 	char c[2048]={0}; 	char d[2048]={0}; 	float result=0; 	Treetraverse(node,c); 	Treetraverse(rightnode,d); 	result = Findlcs(c,d); 	return result; } c和d穿进去之后值就会改变。 float Findlcs(char *a,char *b) 这个函数的生面是上面这样c 和 d 是数组首元素首地址，而一般程序都是在整机下执行所以地址会变是很正常的

user: user-9
content: 这就不知道了。

user: user-0
content: 引用 8 楼 user-10 的回复:[quote=引用 7 楼 user-10 的回复:] 楼主一定是没有声明float Findlcs(char *a,char *b)这个函数就调用了。 而且float Findlcs(char *a,char *b)写在Treesimilarity之前 不要意思，说反了 楼主一定是没有声明float Findlcs(char *a,char *b)这个函数就调用了。 而且float Findlcs(char *a,char *b)写在Treesimilarity之前 [/quote] 我声明了的，在.h文件中我对所有用到的函数进行了声明。

user: user-10
content: 引用 7 楼 user-10 的回复:楼主一定是没有声明float Findlcs(char *a,char *b)这个函数就调用了。 而且float Findlcs(char *a,char *b)写在Treesimilarity之前 不要意思，说反了 楼主一定是没有声明float Findlcs(char *a,char *b)这个函数就调用了。 而且float Findlcs(char *a,char *b)写在Treesimilarity之前

user: user-10
content: 楼主一定是没有声明float Findlcs(char *a,char *b)这个函数就调用了。 而且float Findlcs(char *a,char *b)写在Treesimilarity之前

user: user-5
content: 引用 5 楼 MarcoReus 的回复:我是不明白指针为什么被改变，指针被改变的位置非常明确，就在调用函数，传递指针的时候。我使用的是64位的机器，程序在32位的机器上没有这个问题。 我正在教你使用gdb的watch命令监视莫名其妙改变值的变量是被哪里的指令改掉的。你可以视而不见。  理解和讨论之前请先学会如何观察！

user: user-0
content: 我是不明白指针为什么被改变，指针被改变的位置非常明确，就在调用函数，传递指针的时候。我使用的是64位的机器，程序在32位的机器上没有这个问题。

user: user-5
content: watch 表达式：设置一个监视点，一旦被监视的“表达式”的值改变，gdb将强行终止正在被调试的程序。如： watch a  2. 设置观察点(WatchPoint) 观察点一般用来观察某个表达式(变量也是一种表达式)的值是否变化了。如果有变化，马上停住程序。有下面的几种方法来设置观察点： watch <expr> 为表达式(变量)expr设置一个观察点。一旦表达式值有变化时，马上停住程序。 rwatch <expr> 当表达式(变量)expr被读时，停住程序。 awatch <expr> 当表达式(变量)的值被读或被写时，停住程序。 info watchpoints 列出当前设置的所有观察点。

user: user-0
content: 代码是这样的 float Treesimilarity(CSNode * node,CSNode * rightnode) { 	char c[2048]={0}; 	char d[2048]={0}; 	float result=0; 	Treetraverse(node,c); 	Treetraverse(rightnode,d); 	result = Findlcs(c,d); 	return result; } c和d穿进去之后值就会改变。 float Findlcs(char *a,char *b) 这个函数的生面是上面这样

user: user-0
content: 我使用的是gcc+gdb，需要传递两个指针，都是char型数组的首地址，在传递之前设置断点，传递进函数之后指针立马就改变了。