关于指针和堆栈溢出。。
首先,我的程序是:
#include<stdio.h>
#include<stdlib.h>
int _tmain(int argc, _TCHAR* argv[])
{
int column[] = {0};
int** p=NULL;
int i ,j, row ;
printf("输入数组的行值:") ;
scanf("%d",&row) ;
p =(int**)malloc(sizeof(int*)*row) ;
for(i=0;i<row;i++)
{
printf("请输入第%d行的元素个数:\n",i+1) ;
scanf("%d",&column[i]) ;
p[i] = (int*)malloc(sizeof(int)*column[i]) ;
}
for(i=0;i<row;i++)
{
for(j=0;j<column[i];j++)
{
*(p[i]+j) = 1;
}
}
for(i=0;i<row;i++)
{
for(j=0;j<column[i];j++)
{
printf("%d",*(p[i]+j)) ;
}
printf("\n");
}
return 0;
}
刚开始,对_tmain开始处设断。
转到反汇编窗口,找到调用_wmain处,_wmain的下一条指令地址0x00411BD8。
另外堆栈寄存器窗口,ESP=0x0012FF6C
而内存0x0012FF6C处内容:为0x00411BD8。
说明调用_wmain后 ,把调用_wmain处的下一条指令地址入栈。
经过调试知道 column的值为0x0012ff60。
在 程序末尾下断。 相应的内容后
这个时候 看内存:
这个时候0x12FF6C 被覆盖了。。也就是返回地址被篡改了。 另外ebp也改变了。
其实。一开始 我就认为int column[] = {0};这样定义是不正确的,但是编译器通过了。所以我认为 这样定义的是一个指针。即int *column = NULL;
通过后面的赋值 ,各种覆盖。。
PS:第一次写这样的文章,各位多多包涵。虽然没有技术含量。。呵呵。
详细见附件。。
