这很困扰我,但我正在尝试为C ++编程语言练习做练习,问题是简单地找到char []数组的大小和长度,我做了,但是它当我尝试验证它是否是一个有效的指针时会遇到问题:
void size_length(const char* p, int& size, int& length)
{
//I don't know why, but this causes all entries to return 0
if (!p) size = 0; length = 0; return;
//Copy the pointer, as I want the original intact
const char* cp = p;
while (*cp++) ++size; ++length;
++size; //Null character
size *= sizeof(char); //For portability
}
int main()
{
char* str{ new char[15]{"A short string"} };
int s{ 0 }, l{ 0 };
size_length(str, s, l);
cout << "Size: " << s << endl << "Length: " << l << endl;
}
在size_length()的第二行,当我尝试验证我有一个合法的指针,例如,如果我传递了一个免费存储nullptr,它会导致所有尝试注册为无效并返回0,0(我放置了几个语句在一条线上以节省空间)。我尝试过该语句的变体并传递了许多不同的东西,但它都返回0,0。如果我删除该行,程序运行正常,但是!
如果有人能告诉我这是错误的和/或为什么我不应该在明显的特定情况下测试nullptr(我试图做通过测试有效性确定的事情)我将不胜感激。
答案 0 :(得分:0)
首先,你应该知道:
if (!p) size = 0; length = 0; return;
相当于:
if (!p)
size = 0;
length = 0;
return;
换句话说,它会将length
归零并返回,无论如何!
如果你的意图是使所有三个陈述都有条件,你需要:
if (!p) { size = 0; length = 0; return; }
等同于:
if (!p) {
size = 0;
length = 0;
return;
}
同上:
while (*cp++) ++size; ++length;
因为++length
目前在循环结束后执行一次。
而且,顺便说一句,我喜欢你的陈述&#34;便携性&#34; :-)根据定义,sizeof(char)
总是一个,所以没有理由为什么你的代码在没有身份乘法的情况下是不可移植的。