C++面试题之字符串改错

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kevin_org

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值