c语言,访问空指针
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct string
{
int flag;//符号位
char *str;
int length;//字符串长度
}string;
typedef string Elemtype;
typedef struct node
{
Elemtype data;
struct node *next;
}node, *pnode;
void showElem( pnode list )
{
pnode p = list->next;
puts( "123" );
}
int main( void )
{
pnode list;
list = ( pnode ) malloc( sizeof(node) );
list->next = 0;
showElem(list); //正常访问
char buf[120];
char *str;
string s;
gets( buf );
str = ( char* )malloc( sizeof(buf) + 1);
s.flag = 1;
strcpy( buf, str );
s.length = sizeof( buf ) - 1;
showElem(list); // 访问空指针,出错
return 0;
}
showElem( ) 的作用只是想访问 list ->next
我明明在main函数中 给 list 分配空间,并且给 list ->next = 0 初始化
结果在showElem( ) 访问 list 却空指针报错
调试环境是VS2013
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我测试了你的程序,是像楼上说的那样,str实际上申请了121字节的内存,而buf只有12字节代码,如果在Main函数栈中,buf指针变量和list指针变量“挨”在一起的话(实际上也是这样),那么buf溢出的字节直接覆盖到了list变量那里,导致其改变。 直接测试list在strcpy前后是否发生改变即可判断。
猜测:应该是因为你把 strcpy 的参数弄反了,将一个比 buf 的容量更大的缓冲区的内容复制到了 buf 中,导致 buf 溢出。buf 溢出的数据将 list 指针的值给『淹没』了。至于 buf 溢出的数据为何会淹没 lisp 指针的值,这与栈空间的分配机制有关,这方面的知识可以找一些进程内存布局的文章看。
要验证这个猜测是不是对,你可以在 vs 调试程序的过程中,观察
list
与list->next
的值有没有变化。strcpy的原型是
从str拷贝到buf,意义不明,应该写反了?
还有两句
showElem(list)
之间没有对list进行操作请给出详细的报错,你的报错说的是不允许的系统调用。