首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言中栈有关问题

2013-02-02 
C语言中栈问题我想用C语言修改函数的返回值,就是main-》a-》b然后b修改栈中的返回地址直接跳回main函数#incl

C语言中栈问题
我想用C语言修改函数的返回值,就是main-》a-》b然后b修改栈中的返回地址直接跳回main函数



#include<stdio.h>
extern int main();
int b(unsigned int a){
unsigned int i = 0;
printf("b start\n");
printf("address[%p] , value[0x%x]\n",(&i - 3),*(&i - 3));
*(&i -3) = a; 
printf("address[%p] , value[0x%x]\n",(&i - 3),*(&i - 3));
printf("b end\n");
return 0;
}
int a() {
unsigned int a = 1;
printf("a start\n");
printf("address[%p] , value[0x%x]\n",(&a - 1),*(&a-1));
printf("address[%p] , value[0x%x]\n",(&a - 2),*(&a-2));
printf("address[%p] , value[0x%x]\n",(&a - 3),*(&a-3));
b(*(&a - 3));
printf("a end \n");
return 1;
}

int main() {
printf("a %p\n",a);
printf("main %p\n",main);
a();
printf("main end\n");
return 0;
}

[解决办法]
b修改栈中的返回地址直接跳回main函数
b哪里修改了?
[解决办法]
C语言本身有提供这样的功能吗?用汇编搞搞试试呢
[解决办法]
看一下编译时加GS没
[解决办法]
先看下汇编b(*(&a - 3));&a-3是不是main的返回值,而且在b中没有看到你对他的修改
[解决办法]
仅供参考
#include <stdio.h>
#include <setjmp.h>
jmp_buf mark;
int i=0;
void c() {
    printf( "c in\n");
    if (1==i%2) longjmp( mark, i );
    printf( "c out\n");
}
void b() {
    printf( "b in\n");
    c();
    printf( "b out\n");
}
void a() {
    printf( "a in\n");
    b();
    printf( "a out\n");
}
void main( void )
{
   int jmpret;
   jmpret = setjmp( mark );
   printf( "Start %d\n",jmpret);
   if( jmpret == 0 ) {
       printf( "First\n");
       a();
       i++;
       a();
   } else {
       printf( "Second\n");
   }
}
//Start 0
//First
//a in
//b in
//c in
//c out
//b out
//a out
//a in
//b in
//c in
//Start 1
//Second
//

[解决办法]
2次ebp,是为了16字节对齐

3*4比较靠谱些
[解决办法]
引用:
引用:仅供参考C/C++ code?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647#include <stdio.h>#include <setjmp.h>jmp_buf mark;int i=0;void c……


我知道有setjmp这个库,但是我想在就想知道,为什么直接修改栈的返回值不能跳过a函数字节返回到main中。


搜“栈平衡”

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!


[解决办法]
引用:
仅供参考C/C++ code?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647#include <stdio.h>#include <setjmp.h>jmp_buf mark;int i=0;void c() {    printf( "c in\n……

赵老师  用嵌入式汇编如何解决?
[解决办法]
引用:
引用:引用:仅供参考C/C++ code?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647#include <stdio.h>#include <setjmp.h>jmp_bu……

赵老师 顺便看下我的问题http://bbs.csdn.net/topics/390336432 

热点排行
Bad Request.