#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;
}
這樣修改完成後,再運行起來 就沒有問題了;