本文介绍了strlen 是否在具有未初始化值未定义行为的字符串上?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

strlen 返回终止空字符之前的字符数.strlen 的实现可能如下所示:

strlen returns the number of characters that precede the terminating null character. An implementation of strlen might look like this:

size_t strlen(const char * str)
{
    const char *s;
    for (s = str; *s; ++s) {}
    return(s - str);
}

此特定实现取消引用 s,其中 s 可能包含不确定的值.相当于:

This particular implementation dereferences s, where s may contain indeterminate values. It's equivalent to this:

int a;
int* p = &a;
*p;

例如,如果有人要这样做(这会导致 strlen 给出错误的输出):

So for example if one were to do this (which causes strlen to give an incorrect output):

char buffer[10];
buffer[9] = '\0';
strlen(buffer);

这是未定义的行为吗?

推荐答案

调用标准函数 strlen 会导致未定义的行为.DR 451 澄清了这一点:

Calling the standard function strlen causes undefined behaviour. DR 451 clarifies this:

库函数在用于不确定值时将表现出未定义的行为

更深入的讨论 看到这个线程.

这篇关于strlen 是否在具有未初始化值未定义行为的字符串上?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-12 11:56