记录一个strlen函数引发的错误

#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;
}

这样修改完成后,再运行起来 就没有问题了;

 

 

Guess you like

Origin blog.csdn.net/Wuzm_/article/details/103096778