今天在学习C++的过程中犯了一个错误,输入如下代码进行测试:
#include <iostream>
#include<cstring>
using namespace std;
char* getname(void);
int main()
{
char* name;
name = getname();
cout << name << " at " << (int*)name << "\n";
delete [] name;
name = getname();
cout << name << " at " << (int *)name << "\n";
delete [] name;
system("pause");
return 0;
}
char* getname()
{
char temp[80];
cout << "Enter last name:";
cin >> temp;
char* pn = new char[strlen(temp) + 1];
strcpy_s(pn, sizeof(pn), temp);
return pn;
}
运行出现如图错误
经过断点调试发现错误段代码如下:
char* pn = new char[strlen(temp) + 1];
strcpy_s(pn, sizeof(pn), temp);
实际上是错误的使用了sizeof运算符,sizeof运算符作用是计算类型或变量的字节。当把数组名作为操作数传入时,它计算的是整个数组的字节数。而单词把指针变量作为操作数传入时,计算的是指针变量所占的字节数。而由于指针与数组的相似性,会经常在这个地方用错。要想计算指针所指内容所用字节数,正确形式如下:
char* pn = new char[strlen(temp) + 1];
strcpy_s(pn, sizeof(char)*strlen(temp)+1, temp);
运行后程序能完美运行,以后在使用sizeof运算符时应多注意。有更好的修改欢迎大家指教。