#include <stdio.h>
#include <string.h>
#include <windows.h>
#include "crc16.h"
#include "malloc.h"
char* testMalloc()
{
char strtemp[6] = {'H','e','l','l','o','\0'};
char *str = "Hello";
printf("内容:%s\n长度:%d\n", strtemp,strlen(strtemp));
char* p = malloc(strlen(strtemp));
strcpy(p, strtemp);
return p;
}
int main()
{
char *pResult = testMalloc();
printf("%s", pResult);
free(pResult);
system("pause");
return 0;
}
直接看代码,上面的代码似乎没有什么问题。直接运行看看效果
看这里报的一个错误: HEAP CORRUPTION DETECTED 这个错误大概是说:内存溢出了
接下来进入主题,分析一下代码可知
char* testMalloc()
{
//这里实际内存占6个字符长度的内存
char strtemp[6] = {'H','e','l','l','o','\0'};
char *str = "Hello";
printf("内容:%s\n长度:%d\n", strtemp,strlen(strtemp)); //strlen的详细用法,是获取以‘\0’结尾的字符串的长度,当然不包含‘\0’所以此时我们获取的长度是5个字符长度的内存
char* p = malloc(strlen(strtemp)); //这里分配的内存只有5个 但是我们实际拷贝的数据有6个长度
strcpy(p, strtemp);
return p;
}
这里最主要的问题是'\n'这个问题,因为在strlen中是不会带上这个字符长度的,但是分配内存的时候一定要带上,所以解决方案就是在
分配内存的时候 多加一个字节的数据即可,这样就能包含'\n'这个字节了,就不会出错了
修改后的代码:
char* testMalloc()
{
//这里实际内存占6个字符长度的内存
char strtemp[6] = {'H','e','l','l','o','\0'};
char *str = "Hello";
printf("内容:%s\n长度:%d\n", strtemp,strlen(strtemp)); //strlen的详细用法,是获取以‘\0’结尾的字符串的长度,当然不包含‘\0’所以此时我们获取的长度是5个字符长度的内存
char* p = malloc(strlen(strtemp)+1); //这里分配的内存改成6个长度
strcpy(p, strtemp);
return p;
}
这样修改完成后,再运行起来 就没有问题了;