C++易错点之equal

  上代码!!!

#include<iostream>
#include<algorithm>
#include<string.h>

using namespace std;

int main()
{
	char *p[] = {"Hello", "World", "!"};
	char *q[] = {strdup(p[0]), strdup(p[1]), strdup(p[2])};		
	char *r[] = {p[0], p[1], p[2]};
	
	for(int i = 0l i <= 2; ++i)
	// Hello  World  !
		cout << p[i] << "  ";		
	cout << endl;
	
	for(int i = 0l i <= 2; ++i)
	// Hello  World  !
		cout << q[i] << "  ";
	cout << endl;

	for(int i = 0l i <= 2; ++i)
	// Hello  World  !
		cout << r[i] << "  ";
	cout << endl;
	
	cout << equal(begin(p), end(p), q) << endl;		// 0
	cout << equal(begin(p), end(p), r) << endl;		// 1
	free(q[0]);
	free(q[1]);
	free(q[2]);
}
strdup函数将字符串拷贝到新建的位置处。strdup()在内部调用了malloc()为变量分配内存,不需要使用返回的字符串时,需要用free()释放相应的内存空间,否则会造成内存泄漏。返回一个指针,指向为复制字符串分配的空间;如果分配空间失败,则返回NULL值。

  为什么p, q, r三者的内容都是一样的,和p进行比较的时候q和p不相同,r却和p相同呢?

  我们知道,C风格的字符串本质其实是char* 类型,而equal使用==运算符来比较两个序列中的元素。因此equal比较的实际上是元素的地址,q中的字符串是新开辟的空间,因此其地址肯定和p中字符串的空间不同,输出0。r中的字符串实际上就是p中字符串的地址,因此他们相同,输出1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值