简体   繁体   中英

Testing nullptr in Char Array (C++)

This is bothering my a great deal, but I was trying to do an exercise for The C++ Programming Language exercises, and the question was to simply find the size and length of a char[] array, which I did, however it encounters problems when I try to verify that it's a valid pointer:

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;
}

In the second line of size_length() when I try to verify I have a legal pointer, such as if I passed a free store nullptr, it causes ALL attempts to register as invalid and returns 0, 0 (I placed several statements on one line to save space here). I've tried variations of the statement and passed many different things, but it all returns 0, 0. If I remove the line, the program works fine, however!

If anyone could tell me what it is I'm doing wrong and/or why I shouldn't be testing for nullptr in apparently THIS specific circumstance (I'm trying to do the right thing by testing validity) I would appreciate it.

For a start, you should be aware that:

if (!p) size = 0; length = 0; return;

is equivalent to:

if (!p)
    size = 0;
length = 0;
return;

In other words, it zeroes length and returns no matter what!

If your intent is to make all three statements conditional, you need:

if (!p) { size = 0; length = 0; return; }

which equates to:

if (!p) {
    size = 0;
    length = 0;
    return;
}

Ditto with:

while (*cp++) ++size; ++length;

in that the ++length is currently executed once after the loop finishes.

And, as an aside, I love your statement "for portability" :-) By definition, sizeof(char) is always one so there's absolutely no reason why your code isn't portable without that identity multiplication.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM