c - 当数组不包含 null 终止符时,为什么 strlen() 返回奇怪的结果?

标签 c arrays string

我有两个程序。两者都从字符串文字初始化数组。在一种情况下,数组大小正是我想要放入数组中的字符数。

我想知道为什么两个程序的 strlen() 返回的大小输出不同。是因为缺少终止空字符吗?如果是这样,那么为什么输出是 16?

#include<stdio.h>
#include<string.h>
main()
{
    char str[5] = "ankit";
    printf("size of = %d \n ",sizeof(str));
    int len = strlen(str);
    printf("length = %d \n ",len);
}

输出:- 大小 = 5,长度 = 16

#include<stdio.h>
#include<string.h>
main()
{
    char str[] = "ankit";
    printf("size of = %d \n ",sizeof(str));
    int len = strlen(str);
    printf("length = %d \n ",len);
}

输出:- 大小 = 6,长度 = 5

最佳答案

在你的第一个代码中,通过编写

 char str[5] = "ankit";

您没有任何空间可供存储空终止符,而 str 需要有该空间才能用作字符串。所以,在这种情况下,strlen()调用undefined behavior通过超出分配的内存来搜索空终止符。

OTOH,在第二个片段中,

char str[] = "ankit";

您将大小分配留给编译器,它会为用作初始值设定项和空终止符的字符串文字中的元素分配内存。所以,你得到了想要的结果。

IMO,总是使用后面的方法,可以避免时不时的很多麻烦。

关于c - 当数组不包含 null 终止符时,为什么 strlen() 返回奇怪的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33938611/

相关文章:

复杂的字符串和数组声明

c - 了解C语言中for循环的基础知识

c - 没有其他“如果”的“其他”

c - 将标准输出重定向到 C 中的变量

javascript - 错误 : First row is not an array. Google 饼图

c - 递归构建字符串

C 代码与 Qt gui 绑定(bind)

javascript - 使用自定义属性的迭代数组的长度

java - 字符串和符号的压缩

java - console.readLine() 和 console.format() : What is meant by arguments referenced by format specifiers?