c语言 在一个线程上开辟一段内存;

Python061

c语言 在一个线程上开辟一段内存;,第1张

这个不是C语言能做的,因为有“类”。

基本实现思路和@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的……思路是这样的,你也是这样想的吧,想必我说的就是你想的,只是你在编译是总是不得过,对啊,呵呵,别傻啦,我们能找到的编译器是要做安全性检查的(不光是一些语法的)

除非,你在写之前,自己先写一个编译器来……或者你已经找到了这样的工具