首页 > 解决方案 > 字符串终止符问题

问题描述

如果我输入这段代码,它会编译并运行(我使用 GCC)

#include<stdio.h>
int main()
{

char sentence[8]="September";

printf("The size of the array is %d \n",sizeof(sentence));

printf("The array is %s \n",sentence);
}

并给出输出

数组大小为 8

该阵列是Septembe

这是如何工作的?C 需要一个字符串终止符才能知道字符串已经结束。数组如何值 8 个字节的空间并知道在哪里停止?

标签: c

解决方案


通过将非 NUL 终止的字符串传递给printf("%s"),您正在调用未定义的行为

就其本质而言,结果是不确定的。它可能看起来“有效”(就像你看到的那样)。


正如其他人所解释的那样,可能发生的事情是您的字符串后面恰好有一个零字节,这停止printf了进一步发展。但是,如果您要围绕该变量添加更多内容,您可能会看到不同的行为:

#include<stdio.h>

int main(void)
{
    char sentence[8] = "September";        // NOT NUL TERMINATED!
    char stuff[] = "This way is better";

    printf("%s\n", sentence);              // Will overrun sentence
    return 0;
}

推荐阅读