这让我很困扰,但是我正在尝试进行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(我正在通过测试有效性来做正确的事情),我将不胜感激。
最佳答案
首先,您应该注意:
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
当前在循环结束后执行一次。而且,顺便说一句,我喜欢您的声明“出于可移植性” :-)根据定义,
sizeof(char)
始终是一个,因此绝对没有理由不使用该标识乘法就无法移植您的代码。关于c++ - 在Char Array(C++)中测试nullptr,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40427506/