指针和内存的关系

点点圈 提交于 2020-01-10 03:07:34

1、如何描述内存:

(1)一段内存需要有一个地址和内存的大小才可以描述;

(2)一个内存可以说是一个buffer,那么这个buffer就是一个指针,然后还需要一个buffer_size;

(3)也可以用头指针和尾指针来描述,其实尾指针减去头也就是size;

2、具体代码

(1)要注意一个函数如何实现传内存的指针进去,如何修改这个指针的所指向的内容;

(2)使用memcpy函数,将内存块复制过去;

(3)如果传指针的指针进去,在函数体的外面是不能实现将这个指针指向需要的内存。

 

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

void* a_buf = NULL;


void func1(const char* const Inbuf,const int InbufSize,char *const Outbuf,int *OutbufSize)//这个是正确的
{
	if((Inbuf != NULL) && (Outbuf != NULL) && (InbufSize != 0))	
	{
		memcpy(Outbuf,Inbuf,InbufSize);
		memcpy(Outbuf+InbufSize,"end\0",4);
		printf("func1 Outbuf = %s\n",Outbuf);
		printf("func1 addr Outbuf = %p\n",Outbuf);
	}
	else
	{
		printf("fun1 parameter error\n");
		exit(-1);
	}

}


void func2(const char *const Inbuf,const int InbufSize,char ** Outbuf,int *OutbufSize)//这个是不可以的,这个是修改了指针的值,但是内存没被复制
{
	char* a_buf = (char*)malloc(100);
	if((Inbuf != NULL) && (*Outbuf != NULL) && (InbufSize != 0))	
	{
		memcpy(a_buf,Inbuf,InbufSize);
		memcpy(a_buf+InbufSize,"end\0",4);
		*Outbuf = a_buf;
		printf("fun2 *Outbuf = %s\n",*Outbuf);
		printf("fun2 addr *Outbuf = %p\n",*Outbuf);
	}
	else
	{
		printf("fun2 parameter error\n");
		exit(-1);
	}

}


void func(const char *const Inbuf,const int InbufSize,char* Outbuf,int *OutbufSize)
{
	memset(Outbuf,0,9);
	func1(Inbuf,InbufSize,Outbuf,OutbufSize);
	printf("func Outbuf = %s\n",Outbuf);	
	printf("func addr Outbuf = %p\n",Outbuf);


/*	
	memset(Outbuf,0,OutbufSize);
	func2(Inbuf,InbufSize,&Outbuf,OutbufSize);
	printf("Outbuf = %s\n",Outbuf);	
	printf("addr Outbuf = %p\n",Outbuf);
*/

}


int main(int argc,char* argv[])
{
	char *buf = "12345";
	int inLen = strlen(buf);
	char* outbuf = NULL;
	int outSize = 0;
	printf("hello word!\n");
	
	outbuf = (char*)malloc(inLen+4); //加4是为了加end\0,4个字节,一共是9个字节
	memset(outbuf,0,inLen+4);

	func(buf,inLen,outbuf,&outSize);
	printf("main outbuf = %s\n",outbuf);	

/*
	memset(outbuf,0,inLen+4);
	printf("func1:\n");
	printf("before func1 addr outbuf = %p\n",outbuf);
	func1(buf,inLen,outbuf,&outSize);
	printf("             addr outbuf = %p\n",outbuf);
	printf("outbuf = %s\n",outbuf);

	
	printf("func2:\n");
	memset(outbuf,0,inLen+4);
	printf("before func2 addr outbuf = %p\n",outbuf);
	func2(buf,inLen,&outbuf,&outSize);
	printf("             addr outbuf = %p\n",outbuf);
	printf("outbuf = %s\n",outbuf);
*/

	free(a_buf);
	free(outbuf);
	return 0;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!