嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

周梦康 发表于 2016-03-08 1652 次浏览 标签 : C

免费领取阿里云优惠券 我的直播 - 《PHP 进阶之路》

下面是给结构体分配内存

#include <stdio.h>
#include <stdlib.h>

typedef struct _tsrm_tls_entry {
    void **storage;
    int count;
    int next;
} tsrm_tls_entry;


int main(int argc, char const *argv[])
{
	tsrm_tls_entry *tte = NULL;

	tte = malloc(sizeof(tsrm_tls_entry));

	tte->count = 1;
	tte->next = 2;

	printf("%d,%d\n", tte->count,tte->next);

	return 0;
}

但是如果写成

tte = malloc(sizeof(tsrm_tls_entry *));

也不会报错。

而我的意图是像给tte分配一个tsrm_tls_entry结构体大小的内存空间,而不是需要一个指针。但是由于malloc访问越界太少的的话操作系统不一定检测的到,而且后面也可能是分配过的内存,所以运行时不会有错误,但是可能修改其他意想不到变量的值。

为了验证上面的说法,同理给tsrm_tls_entry里的storage分配内存,然后不停地添加元素。

typedef struct _tsrm_tls_entry {
    void **storage;
    int count;
} tsrm_tls_entry;


int main(int argc, char const *argv[])
{
	tsrm_tls_entry *tte = NULL;

	tte = malloc(sizeof(tsrm_tls_entry));

	tte->storage = malloc(sizeof(void *)); // 我们只分配了一个泛型指针的大小内存空间给storage数组

	for(int i=1; i>0; i++){
		tte->storage[i] = 10; 
	 	printf("%d\n",i);
	}

	return 0;
}

编译执行,发现运行到一定时候就会报错

...
16885
16886
16887
16888
16889
段错误 (core dumped)
[zhoumengkang@localhost unix]$


嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表