基本实现思路和@fengfei5551223 类似
提出一些不同的实现细节:
1、申请空间为了做到最大化兼容,使用void指针;size是具体的数值
void * buf=NULL
void create_memory(){
buf=(void *) malloc(size)//
}
2、你的要求是开辟内存,写内存,读内存,那么应该是操作的同一块内存区域,
因此传参数不能总是调用create_memory方法,否则每次总是新申请内存,
没有达到共用的目的
class A{
char *buf=NULL
public:
//增加一个获取开辟空间地址函数
void *get_buf(){
return buf
}
}
int main(){
A *a
pthread_create(&a[0],NULL,a->create_memory,NULL)
if(NULL != a->get_buf()){ // 为了保证开辟成功内存
//将开辟好的空间地址作为参数传递给其它线程使用
pthread_create(&a[1],NULL,a->write_memory,a->get_buf())
pthread_create(&a[2],NULL,a->read_memory,a->get_buf())
}
。。。
}
3、对开辟出的内存区域没有最终销毁这个是很危险的,
当然我不清楚你的需求,但是大多数场景下还有最后一步是做destory;
而且要用到同步互斥变量,所以最后需要报这些变量销毁;
这样使得程序更具有健壮性。
你这是想用二级指针,,,但事实上
却得到了
不正确的
结果
,,这也是指针
容易出错的地方。
你先定义了一个二级指针
,tree
并初始化
为
NULL,也就是
0,tree本身在栈区,但其指向0。
然后
*tree
,这个*tree
的意思
你能明白
吗?
是访问0这个地址,也就是将
后面分配来的地址
写到
0
这个内存地址上,但0号地址事实上不可用,因而导致程序异常。你完全没必要用二级指针
,也就是你将
main
里面的
两个
两个
*
去掉就可以了
当然
你也没有释放内存。
正确的写法如下:
#include
<stdio.h>
#include
<stdlib.h>
typedef
struct
BiTNode
{
char
data
struct
BiTNode
*lchild,
*rchild
}BiTnode,*BiTree
void
main()
{
BiTree
tree=NULL
tree=(BiTree)malloc(sizeof(BiTnode))
free(tree)
tree=NULL
return
}
如果要用二级指针
:
#include
<stdio.h>
#include
<stdlib.h>
typedef
struct
BiTNode
{
char
data
struct
BiTNode
*lchild,
*rchild
}BiTnode,*BiTree
void
main()
{
BiTree
tree=NULL
tree=(BiTree)malloc(sizeof(BiTnode))
//想使用二级指针
可以在这里定义
BiTree
*
ptree=&tree
//ptree
是
指向
你申请的空间的二级指针
free(tree)
tree=NULL
return
}
生成大链表,最好里面用大节点,这样可以加速内存的耗尽,分配时用calloc申请内存,malloc也可以,生成中的节点中多用指针,然后指针不指空值(这样就有可能指到系统区去),这里的用三个do{}while(1)来实现,一个是生成链表,一个是用链表节点值做任意的运算——这两个是同一等级的,还有一个是最外层。这里一定是要用到break的……思路是这样的,你也是这样想的吧,想必我说的就是你想的,只是你在编译是总是不得过,对啊,呵呵,别傻啦,我们能找到的编译器是要做安全性检查的(不光是一些语法的)除非,你在写之前,自己先写一个编译器来……或者你已经找到了这样的工具