编译器对const char*的态度转变

本文探讨了在C++中编译器对待`const char*`的处理,通过实例分析了访问越界的问题。在VS2010中,尽管编译通过,但运行时会遇到`Access Violation`错误。问题源于C++中对文字常量的保护,而早期编译器可能允许`char* str="Astring"`这样的用法,但这样做在C++中可能会导致安全问题。解决方案是避免直接修改文字常量,可以使用`_tcsdup()`创建副本后再进行操作。
摘要由CSDN通过智能技术生成

 1.问题

char * str="Astring";
strrev(str);

上面这两行代码,第一眼感觉是没有错的,而且MSDN里面也是这样写的。编译能够通过,但是运行起来就会报错,提示Access Violation(访问越界)。

MSDN里面的代码精简一下大致是这样:

/*++ cstr.cpp 
 *
 *version:1.1
 *created:2011-08-14 21:30
 *purpose:show AV error
 *
--*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
void _tmain()
{
	_TCHAR* str=_T("Astring");
	_tprintf(_T("%s reversed is '%s'\n"),str,_tcsrev(str));
	system("pause");
}

这个例子在msdn中本来是用来说明tchar.h对generic-text的支持,然而在使用_tcsrev()对str进行反转时,却出现了Access Violation错误。

仔细再查看一遍sample代码,发现它的后缀名是.c,而笔者编译时是.cpp,问题是否出在这里? 修改上面的文件为cstr.c,再编译,编译成功,可是运行起来,问题依旧。

2.分析

编译能够通过,但

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值