C:非NUL终止的字符数组

时间:2016-01-05 16:38:56

标签: c string sizeof strlen

我看到here如果没有NULL终止,则使用strlen找不到(unsigned char *)字符串长度是不可能的,因为strlen函数将遍历字符串但不会找到任何'\ 0',因此是运行时错误。我认为使用signed char *声明的字符串完全相同。

我看到的代码片段正在执行类似int len = sizeof(unsigned char *);的操作,但据我了解,它只提供指针的大小 - 字大小。有可能以另一种方式使用sizeof来获得结果,还是我必须在其他地方获得长度?

2 个答案:

答案 0 :(得分:4)

是的,你必须从其他地方获得长度。指针不包含长度信息,没有约定(例如最后一个元素为0),无法判断数组的长度。

答案 1 :(得分:1)

  

非NUL终止字符串

C中没有这样的东西。在C中,通过定义,字符串总是以空字符结尾。

  

string 是由第一个空字符终止并包含第一个空字符的连续字符序列。 C11§7.1.11

字符串不是指针。指针可以指向字符串。请参阅下面的限制。

unsigned char *ssigned char *schar *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