当前位置:  开发笔记 > 编程语言 > 正文

C char指针长度

如何解决《Cchar指针长度》经验,为你挑选了2个好方法。

这是Coursera的一个测验(未评分).问题是,以下代码可能评估的内容是什么?正确的答案是127和0(其他选项崩溃,-1,128.为什么以下代码可能评估为0?我理解为什么它会评估为127.它是否就像char字节未初始化一样简单因此随机?还可以评估0到127之间的任何#吗?

int foo(void) {

    char bar[128];

    char *baz = &bar[0];

    baz[127] = 0;

    return strlen(baz);

}

Bathsheba.. 5

代码的行为是不确定的.我的意思是答案可以是0到127之间的任何值.

strlen将读取未初始化但未包含的未初始化内存bar[127],这作为终止条件.

但是因为该数组由char元素组成,所以读取这些数据并不是未定义的,因为char类型不能有陷阱表示.它只是包含不确定的值.

(如果有bar静态存储持续时间则完全不同.那么答案总是为零).


下面的大部分评论都是对这个答案的错误表述作出反应,该答案表明行为未定义.



1> Bathsheba..:

代码的行为是不确定的.我的意思是答案可以是0到127之间的任何值.

strlen将读取未初始化但未包含的未初始化内存bar[127],这作为终止条件.

但是因为该数组由char元素组成,所以读取这些数据并不是未定义的,因为char类型不能有陷阱表示.它只是包含不确定的值.

(如果有bar静态存储持续时间则完全不同.那么答案总是为零).


下面的大部分评论都是对这个答案的错误表述作出反应,该答案表明行为未定义.


我不确定它是不确定的.超出缓冲区限制没有访问权限.它只是读取不确定的值.
@StoryTeller我会说你必须在标准中提供一个引用,以排除具有陷阱值的`char`.

2> Sourav Ghosh..:

以前这个答案有错误的信息,这种情况不会调用未定义的行为.


编辑答案:

TL; DR我们不能有明确的答案,代码包含不确定的行为.

详细说明,char bar[128];是一个自动局部变量,如果没有明确初始化,将包含不确定的值.

引用C11,章节§6.7.9

如果未显式初始化具有自动存储持续时间的对象,则其值不确定.[....]

在您的代码中,您只为索引127处的数组的一个成员分配了值.剩余的元素仍然具有不确定的值.

尝试将该数组(基本上是指向数组的第一个元素的指针)传递给strlen(),导致对这些值的读取(搜索空终止符)并且由于不确定的值,不能保证它会找到null - 任何特定位置的终结者.

它可以在第一个元素中找到空终止符(ASCII值0)并返回0.

它也可能在任何其他数组元素中找不到任何空终止符(ASCII值0),直到最后一个并返回127.

它可以在数组中的任何位置找到空终止符并返回该计数.

所以,这个问题没有明确的答案.


注: (弥补我的错误认识,以避免读者陷入同样的陷阱进一步)

在这里,读取未初始化的值(即,不确定的值)不会像人们想象的那样调用未定义的行为.

一个班轮:为对象获取地址.

有关此主题的详细讨论,请参阅此处.


char数组将包含介于-128和127之间的不确定值.读取它们不是UB.返回的值将在0到127之间不确定,因为它将返回遇到的第一个\ 0的位置.由于baz [127] = 0,没有UB.
推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有