C中这个意想不到的附加字符的原因是什么?

What is the cause of this unexpected additional character in C?

当我运行以下代码时:

#include <stdio.h>
#include <string.h>

int main() {
    static char foo[32];
    memset(foo, '0', sizeof(foo));
    printf("%s %d\n", foo, sizeof(foo));

    return 0;
}

我收到以下输出:

00000000000000000000000000000000☺ 32

字符串长度为 33,而其大小为 32 字节,因此索引 32 处的“笑脸”字符似乎来自某块未分配的内存。我对这里发生的事情感到困惑,而且我似乎无法很好地表达搜索查询以找到我正在寻找的内容。非常感谢任何建议。

%s in printf() 需要一个指向 strings 的指针,这意味着“由空字符终止的字符序列 " 在 C.

缓冲区 foo 中的所有字节都由 '0' 填充,因此缓冲区中没有终止空字符,并且 printf() 将超出范围查找终止空字符。

当你想打印一个不是字符串的字符序列(一个没有终止空字符的字符)时,你应该指定要打印的长度。

还要注意 sizeof returns size_t%d 格式说明符和要指定的长度(如果它作为参数给出)。传递错误类型的数据会调用 未定义的行为。打印 size_t 的正确格式说明符是 %zu。 (注意 size_t 是无符号的)。

#include <stdio.h>
#include <string.h>

int main() {
    static char foo[32];
    memset(foo, '0', sizeof(foo));
    printf("%.*s %zu\n", (int)sizeof(foo), foo, sizeof(foo));

    return 0;
}