1. 字符串越界问题
void test1()
{
char string[10];
char* str1 = "0123456789";
strcpy(string, str1);
}
错误分析:[C代码可编译过]
1)string不能作为变量使用,是C++中的string类库;
2)str1是一个指向字符的指针,字符串所占长度为11,strcpy函数是将
str1拷贝给string,但string大小只有10,str1大小为11,导致数组越界。
void test2()
{
char str[10], str1[10];
for(int i=0; i<10; i++)
{
str1 = 'a';
}
strcpy(str, str1);
}
错误分析:[代码不能编译通过]
1)数组名str1为char const类型的右值类型,不能赋值;
2)函数strcpy进行拷贝工作,strcpy会从源地址一直往后拷贝,
直到遇上第一个‘\0’为止。拷贝长度不确定如果一直未遇到’\0’导致数组越界。*
//正确修改方式:
void test2()
{
char str[10], str1[10];
for(int i=0; i<10; i++)
{
str1[i] = 'a';
}
str[9] = '\0';
strcpy(str, str1);
}
2. 写出完整的strcpy函数
char* strcpy(char* strDes, const char* strSrc)
{
assert((strDes != NULL) && (strSrc != NULL));
char* address = strSrc;
while((*strDes++ = strSrc) != '\0');
return address;
}
3. 字符串指针
void GetMemory(char *p)
{
p = (char*) malloc(100);
}
void test3()
{
char* str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);// null
}
错误分析:[运行结果为NULL]
1)传入形参不能真正改变形参的值,执行完后仍为NULL;
2)在函数GetMemory和test3中未对申请内存空间释放,造成内存泄露。
//正确修改方式:
void GetMemory(char **p)
{
*p = (char*) malloc(100);
}
void test3()
{
char* str = NULL;
GetMemory(&str);
strcpy(str, "hello world");
printf(str);
free(str);
}
//下面代码有什么问题
char* GetMemory(void)
{
char p[] = "hello world";
return p;
}
void test4(void)
{
char* str = NULL;
str = GetMemory();
printf(str);
}
错误分析:
1)局部变量在函数执行完自动释放
//正确修改方式:
char* GetMemory(void)
{
char *p = "hello world";// 或者static char *p = "hello world";
return p;
}
//下面代码有什么问题
void GetMemory(char **p, int num)
{
*p = (char*) malloc(num);
}
void test5()
{
char* str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello world");
printf(str);
}
错误分析:
1)未判断内存是否申请成功;
2)未释放堆内存;
3)修改printf(str)为printf("%s", str);
//正确修改方式:
void GetMemory(char **p, int num)
{
*p = (char*) malloc(num);
if(*p == NULL)
{
//申请内存失败处理
perror("申请内存失败处理");
return -1;
}
}
void test5()
{
char* str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello world");
printf("%s", str);
free(str);
str = NULL;
}
//下面代码有什么问题
void test6(void)
{
char* str = (char*) malloc(100);
strcpy(str, "hello");
free(str);
}
错误分析:
1)未判断内存是否申请成功;
2)未将释放的堆内存置NULL;
//正确修改方式:
void test6(void)
{
char* str = (char*) malloc(100);
if(str)
{
strcpy(str, "hello");
}
free(str);
str = NULL;
}
4. 野指针
swap(int* p1, int*p2)
{
int *p;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
错误分析:
1)需要添加返回void;
2)在swap函数中p是一个野指针,有可能指向系统区,导致程序运行崩溃*
//正确修改方式:
void swap(int* p1, int*p2)
{
int p;
p = *p1;
*p1 = *p2;
*p2 = p;
}