我看到here如果没有NULL终止,则使用strlen找不到(unsigned char *)字符串长度是不可能的,因为strlen函数将遍历字符串但不会找到任何'\ 0',因此是运行时错误。我认为使用signed char *声明的字符串完全相同。
我看到的代码片段正在执行类似int len = sizeof(unsigned char *);
的操作,但据我了解,它只提供指针的大小 - 字大小。有可能以另一种方式使用sizeof来获得结果,还是我必须在其他地方获得长度?
答案 0 :(得分:4)
是的,你必须从其他地方获得长度。指针不包含长度信息,没有约定(例如最后一个元素为0),无法判断数组的长度。
答案 1 :(得分:1)
非NUL终止字符串
C中没有这样的东西。在C中,通过定义,字符串总是以空字符结尾。
string 是由第一个空字符终止并包含第一个空字符的连续字符序列。 C11§7.1.11
字符串不是指针。指针可以指向字符串。请参阅下面的限制。
unsigned char *s
,signed char *s
或char *s
都是字符指针。它们可能包含某些字符的地址或者具有NULL
之类的值。当OP识别时,sizeof s
是指针的大小而不是字符串的大小。
sizeof()
时, sizeof some_array_variable
可用于查找字符串的大小。长度将比选择情况下的尺寸小1。
strlen()
始终可用于查找字符串的长度。但并非所有数组都是字符串,所有字符指针也不是指向字符串。见下文。
char b[]
是一个数组,sizeof b
将返回6,数组的大小为char
个单位。当b
,正式参数传递给strlen()
时,它会转换为b
的第一个元素的地址,strlen()
使用那是实际的参数。 strlen()
使用该地址查找长度。字符串的 length 是字符数,但不会引入空字符'\0'
,因此结果为5。
char *t
是指向b
的第一个字符的地址的指针。它的大小与系统有关,是指针的大小,如4,8,2等。strlen()
使用上述地址,结果为5。
char b[] = "Hello";
char *t = b;
printf("%zu %zu\n", sizeof b, strlen(b)); // 6 5
printf("%zu %zu\n", sizeof t, strlen(t)); // 4 5
下面,在这两行中,strlen()
是一个问题,因为该函数需要一个指向字符串的指针。相反,它接收一个指向不包含空字符的字符数组(大小为5)的开头的指针。结果是未定义的行为。代码可能返回5,它可能返回100,它可能会使程序崩溃,明天可能会有不同的报告。
char d[5] = "Hello";
char *u = d;
printf("%zu %zu\n", sizeof d, strlen(d)); // 5 *
printf("%zu %zu\n", sizeof u, strlen(u)); // 4 *
在此示例中,数组的大小为100,但字符串长度为5.因此,使用sizeof(e)
查找字符串长度不会返回与strlen(e)
不同的+1答案。< / p>
char e[100] = "Hello";
char *v = e;
printf("%zu %zu\n", sizeof e, strlen(e)); // 100 5
printf("%zu %zu\n", sizeof v, strlen(v)); // 4 5