【发布时间】:2021-08-30 14:59:27
【问题描述】:
当我运行以下代码时:
#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 处的“笑脸”字符似乎来自一些未分配的内存。我对这里发生的事情感到困惑,而且我似乎无法很好地用搜索查询来找到我正在寻找的东西。非常感谢任何建议。
【问题讨论】:
-
问:所以索引 32 处的“笑脸”字符似乎来自一些未分配的内存。是的。您已将 32 个字符数组的所有 32 个字符初始化为 ASCII 数字“0”……但您忘记了终止字符串! C 字符串的最后一个字符必须是二进制“0”。结果是undefined behavior。
-
感谢您的帮助!
-
"字符串长度为 33" -->
foo不是 字符串,因为它缺少 null 字符 i>.