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;
}
来源:CSDN
作者:林凡_123
链接:https://blog.csdn.net/weixin_40405692/article/details/103914474