Why is a null terminator necessary?

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-04 03:36:23

问题


I've been teaching myself c++ for the last couple days to prepare for my freshman year as a CS major. I'm on C-style strings right now, and wondering what the point of a null terminator is.

I understand that it's necessary, but I guess I just don't fundamentally understand why a string wouldn't just end on its last char.


回答1:


I just don't fundamentally understand why a string wouldn't just end on its last char.

There are several ways of knowing where is the "last char":

  1. Store the number of characters in the string separately from the string's characters,
  2. Put a marker that indicates the last char of the string, or
  3. Store the pointer to the last char of the string separately from the string's characters.

C choose the second route; other languages (Pascal, etc.) choose the first route. Some implementations of C++ std::string choose the third route* .


* Even std::string implementations that use the first or the third approach null-terminate their buffers for compatibility with the C portions of the library. This is necessary to ensure that c_str() returns a valid C string.


回答2:


In C and C++, c-strings are stored in a character array. To allow strings of different lengths, these arrays are often allocated much larger than the actual strings they are to contain. For example, a programmer may allocate a char[256] array, which can hold a string with a length anywhere between 0 characters and 255. But the computer has to be able to know exactly how long the string actually is, so it must end with a null character. Otherwise, it would be neccessary for the character array length to be exactly the same as the string (an impractical solution, as allocating and copying memory uses a lot of resources).




回答3:


Because a c-style string doesn't know what character is the last character. For example if you are reading a name you might make a buffer like so:

char buf[256] // this allows c-style strings that contain 255 characters

But when you go to populate that buffer you may not (likely won't) use all of the space. If you fill it with "Jack", the only information you care about is the first five indices, not all 256.




回答4:


Consider each character of the string as memory blocks in the memory. If a string is placed in memory. After that a another string is placed adjacent to it , then the computer will think that the 2nd string is joined to 1st ,if null is absent. So, null acts as delimitor



来源:https://stackoverflow.com/questions/17371157/why-is-a-null-terminator-necessary

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!