gpt4 book ai didi

c - strlen(&string[]) 是如何工作的?

转载 作者:太空宇宙 更新时间:2023-11-04 00:28:30 25 4
gpt4 key购买 nike

这个问题可能有点长。我正在用 C 测试一些字符数组,所以出现了这段代码。

char t[10];
strcpy(t, "abcd");
printf("%d\n", strlen(&t[5]));
printf("Length: %d\n", strlen(t));

现在显然 strlen(&t[5]) 产生 3 而 strlen(t) 返回 4。

我知道字符串长度是 4,从插入四个字符就可以看出这一点。但为什么 strlen(&t[5]) 返回 3?

我的猜测是

String:   a | b | c | d | 0 | 0 | 0 | 0 | 0 | \0
Position: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

strlen(&t[5])看6、7、8位组成的字符串的长度(因为第10个字符是NULL终止符对吧)?

OK,那我做了一些实验,稍微修改了一段代码。

char t[10];
strcpy(t, "abcdefghij");
printf("%d\n", strlen(&t[5]));
printf("Length: %d\n", strlen(t));

现在 strlen(&t[5]) 产生 5 而 strlen(t) 是 10,正如预期的那样。如果我正确理解字符数组,状态现在应该是

String:   a | b | c | d | e | f | g | h | i | j | '\0'
Position: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10

那么为什么 strlen(&t[5]) 这次返回 5?我已经声明了一个长度为 10 的字符数组,那么,按照上面应用的相同逻辑,结果应该是 4 吗?

另外,由于 NULL 终止字符实际上位于第 11 位,我不应该遇到一些编译器错误吗?我是 C 的新手,非常感谢任何人的帮助。

最佳答案

首先让我告诉你,你的“假设”

String:   a | b | c | d | 0 | 0 | 0 | 0 | 0 | \0
Position: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

不正确。根据您的代码,这些值仅“保证”达到索引 4,不会超过该值。

对于第一种情况,在你的代码中

  printf("%d\n", strlen(&t[5]));

由于各种原因是错误的,

  • 您应该使用 %zu 作为 size_t 类型。
  • &t[5] 未指向有效的字符串

上述任何(或两者)都会导致 undefined behavior任何输出都无法证明。

详细说明,定义如下

char t[10];
strcpy(t, "abcd");

您为 t 填充了索引 0 到 3,索引 4 包含空终止符。 t[5] 之后的内容是不确定的。

因此,&t[5] 不是指向字符串第一个元素的指针,因此不能用作 strlen() 的参数。

  • 它可能会在搜索空终止符时超出范围并遇到无效的内存访问,作为副作用,会产生段错误,
  • 它可能会在边界内找到空终止符(只是另一个垃圾值)并报告“看似”有效的长度。

两者的可能性和可能性都一样,真的。 UB就是UB,没有理由。

那么,对于第二种情况,你说

char t[10];
strcpy(t, "abcdefghij");

再次越界访问内存。

您总共有 10 个数组元素来存储一个字符串,因此您可以有 9 个其他 char 元素,外加一个空终止符(以将 char 数组限定为字符串)。

但是,您正试图放置 10 个 char 元素,外加一个空字符(在 strcpy() 中),所以您差一个,访问超出限制的内存,调用 UB。

关于c - strlen(&string[]) 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48403626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com