关于野指针的一些问题

testPhyco 2017-03-02 03:32:52
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct student
{
int num;
char name[20];
float score[3];
};

int main()
{

struct student *stu;
//stu =(struct student*) malloc(sizeof(struct student));
strcpy(stu->name, "Tom");

stu->score[0] = 67.5;
stu->num = 123;
printf("stu->num =%d",stu->num);
printf("stu->score[0] =%f",stu->score[0]);
printf("stu->name=%s\n",stu->name);
return 0;
}


在示例代码中stu因为没有分配空间,导致成了一个野指针。但是这个时候,为什么score和num可以打印出来,name却打印不出来呢?如果只是碰巧的话,struct即使是野指针,随机分配的空间,但是也是连续的一整块空间,但是为什么在头部的num和在尾部的score可以访问,只有中间的name不能访问?
...全文
286 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
linux_hsylar 2017-03-06
  • 打赏
  • 举报
回复
VS2013下,调试根本会断下来,指示stu未被初始化。
sadoshi 2017-03-03
  • 打赏
  • 举报
回复
野指针不一定会导致报错。野指针只是会造成不确定的结果,可能正常,也可能报错。例如你野指针指向的区域刚好是被分配出去的空间,那么就不会报错,但可能会不慎修改了那个区域原有的数据,这样打印出来是正常的,不过可能影响了别的变量数据 在linux下编译器刚好给你野指针分配的随机数不在栈区或者堆区,例如指向的位置在程序代码区,那就会报段错误 总之编译器和操作系统的不同,都会导致展现的形式不一样,所以必须避免野指针
赵4老师 2017-03-03
  • 打赏
  • 举报
回复
其实电脑开机后物理内存的每个字节都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
小灸舞 版主 2017-03-03
  • 打赏
  • 举报
回复
操作野指针是未定义行为
paschen 2017-03-02
  • 打赏
  • 举报
回复
野指针不代表空指针 能访问不代表是对的 没崩溃只是运气
Rookiekk 2017-03-02
  • 打赏
  • 举报
回复
随机地址,是跟操作系统有关吗,分配规则不一样,
testPhyco 2017-03-02
  • 打赏
  • 举报
回复
引用 1 楼 cfjtaishan 的回复:
野指针不是随机分配的空间,野指针是指,指针变量里存放的数据(地址)是随机数,那么它指向的内存空间有可能是可读可写的,有可能是非可读可写;野指针很容易出现段错误,那么就是该随机地址指向了不可读或者不可写,或者既不可读也不写。 不用野指针主要是这个随机地址,不能保证指向的空间是可读可写的。所以,一定要给指针赋值一个可读可写的地址,通过malloc或者指向一个数组都可以。
好吧,是我的编译器有毛病,这个本来全部都不应该打印出来的,不知道为什么我用的编译器打印出来了。我在Linux下用了一下全部都是段错误。现在没有疑问了。
自信男孩 2017-03-02
  • 打赏
  • 举报
回复
野指针不是随机分配的空间,野指针是指,指针变量里存放的数据(地址)是随机数,那么它指向的内存空间有可能是可读可写的,有可能是非可读可写;野指针很容易出现段错误,那么就是该随机地址指向了不可读或者不可写,或者既不可读也不写。 不用野指针主要是这个随机地址,不能保证指向的空间是可读可写的。所以,一定要给指针赋值一个可读可写的地址,通过malloc或者指向一个数组都可以。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧