記錄一個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;
}

這樣修改完成後,再運行起來 就沒有問題了;

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章