const char* a;
如何确保字符串'a'为空终止?当a ="abcd"并且我做sizeof(a)时,我得到4.这是否意味着它不是以null结尾?如果是的话,我会得到5?
Jam*_*lis 31
sizeof(a)给出指针的大小,而不是指针指向的字符数组.就像你说过的那样sizeof(char*).
您需要使用strlen()计算以null结尾的字符串的长度(请注意,返回的长度不包括空终止符,因此strlen("abcd")是4,而不是5).或者,您可以使用字符串文字初始化数组:
char a[] = "abcd";
size_t sizeof_a = sizeof(a); // sizeof_a is 5, because 'a' is an array not a pointer
字符串文字"abcd"以null结尾; 所有字符串文字都以null结尾.
jer*_*jer 12
你得到4因为那是你系统上指针的大小.如果要获取nul终止字符串的长度,则需要strlenC标准库中的函数.
这里的问题是你很困惑sizeof(),这是一个编译时操作,其字符串的长度是一个运行时操作.运行时返回4的原因sizeof(a)是它a是一个指针,C中指针的典型大小是4个字节.为了获得字符串的长度使用strlen.
对于第二个问题,如何确保字符串为空终止.明确地这样做的唯一方法是null自己终止字符串.鉴于只有一个char*没有办法100%保证它被正确地终止.必须非常小心,以确保生产者和消费者之间的合同char*被理解为谁终止字符串.
如果你交给一个char数组,其中可能有也可能没有以null结尾的数据,那么确实没有一个好的检查方法.你可以做的最好的事情是搜索一个空符号,直到指定的certian长度(不是无限期!).但是0并不是在未初始化的内存区域中找到的非常不寻常的数据字节.
这是许多人不喜欢C的事实字符串标准的许多事情之一.找到客户端给你的字符串的长度最好是O(n)搜索操作,最坏的情况是分段错误.
另一个问题当然是数组和指针是可互换的.这意味着array_name + 2是一样的&(array_name[2]),而且sizeof(a)是sizeof(char*),不是数组的长度.