在处理网络数据包时,会考虑一个问题,就是非char型的指针在只处理IP层的时候会不会溢出到TCP层。其实这是不必要的,因为我们可以用ip header length 指定一个长度。 接下来又会考虑一个问题,非char型指针会溢出吗?
int a = 4, b = 8;
int *c = &a;
printf("%p, %d, %d\n", c, *c, c[1]);
return 0;
|
打印结果是:0x7fffffffec40, 4, 8
所以你要是访问就会溢出,那怎么办?我也不知道,但是搜索到一个关于free()函数如何知道指针块大小的问题,基本上就能够说明系统管理的这块程序是不会出错的。进而合格的程序员也要合理的避免错误。
单片机开发的论坛上的说明:
怎样确定一块已分配的内存的大小?
实际上你无法确定。free()函数能做到这一点,但你的程序无法知道free()函数所用的技巧。尽管通过反汇编库函数你可能会发现这种技巧,但是在不同版本的编译程序中,这种技巧可能会有所不同,因此这样做没有什么意义?
free()函数是怎样知道要释放的内存块的大小的?
free()函数对这一点的实现没有统一的标准,在不同的编译程序中,甚至在同一编译程序的不同版本中,其实现都可能会有所不同。尽管free(),malloe(),calloe()和realloc()等函数的工作方式通常是相同的,但它们完全可以采用任何可行的工作方式。
通常,当malloe()等内存分配函数分配一块内存时,它们所获取的内存总是比所要求的稍大一些。它们返回的并不是这块内存的起始地址,而是一个比起始地址稍往后一点的一个地址。一些有关信息,例如所分配的内存块的大小,将被存放在这两个地址之间的那部分区域中
(如果这部分内容被改写,当所分配的这块内存被释放后你的程序中就会出现野指针)。这样,只要检查这部分信息,free()函数就能知道要释放的内存块的大小了。
但是,free()函数并不一定就采用这种方式,它可能会使用一张记录所分配的内存的地址和长度的表,或者将有关数据存放在所分配的内存块的尾部(在所要求大小的内存块后面的一小块内存中),或者通过一个指针存放有关数据。
如果你真的想要编写一批内存分配函数,最好按自己的方式编写。
阅读(1401) | 评论(0) | 转发(0) |