memcpy越界拷贝,会导致崩溃,但具体原因是什么

memcpy越界拷贝,会导致崩溃,但具体原因是什么,第1张

c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。功能:从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中1.source和destin所指的内存区域可能重叠,但是如果source和destin所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。函数返回指向destin的指针.2.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。strncpy是C语言的库函数之一,来自C语言标准库,定义于string.h,char*strncpy(char*dest,char*src,intn),把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回dest。功能:(c/c++)复制字符串src中的内容(字符,数字、汉字.)到字符串dest中,复制多少由size_tn的值决定。如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符长度+'\0'。

内存复制函数及内存的一些思考

内存复制函数:

void *memcpy(void *pvTo,const void *pvFrom,size_t size)

{

assert((pvTO !=NULL)&&(pvFrom != NULL))//使用断言,防止pvTo或pvFrom为NULL

typedef char byte

byte *pbto =(byte *)pvTo //防止改变pvTo的地址

byte *pbfrom = (byte *)pvFrom //防止改变pvFrom的地址

while(size-->0)

{

*pbTo++ = *pbFrom++

}

return pbto

}

关于内存思考:

第一种情况:

/*

*程序崩溃

*因为getmemory并不能传递动态内存,test函数中的str一直都是NULL。

*/

void getmemory(char *p)

{

p = (char *)malloc(100)

}

void test(void)

{

char *str = NULL

getmemory(str)

strcpy(str,"hello,world")//使程序崩溃

printf(str)

}

第二种情况:

/*

*可能是乱码

*因为getmemory返回的是只想“栈内存”的指针,该指针的地址不是NULL,

*但其原有的内容已经被清除,新内容不可知。

*/

char *getmemory(void)

{

char p[]="hello world"

return p

}

void test(void)

{

char *str = NULL

str=getmemory()

// strcpy(str,"hello,world")

printf(str)

}

第三种情况:

/*

*能够输出hello;

*内存泄露;

*

*/

void *getmemory(char **p,int num)

{

*p = (char *)malloc(num)

}

void test(void)

{

char *str = NULL

getmemory(&str,100)

strcpy(str,"hello")

printf(str)

}

第四种情况:

/*

*篡改动态内存区的内容,后果难以预料,非常危险。因为free(str)之后,str称为野指针,

*if(str!=NULL)语句不起作用

*/

void test(void)

{

char *str = (char *)malloc(100)

strcpy(str,"hello")

free(str)

if(str != NULL)

{

strcpy(str,"world")

printf(str)

}

}

问题:动态内存会被自动释放掉吗?

void Func(void)

{

char *p = (char *)malloc(100)

}

(1)指针消亡了,并不表示它指向的内存会被自动释放;

(2)内存被释放了,并不表示指针会消亡或者称为NULL;

看完这个应该能自己找出答案了!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11350296.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存