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;
}
当我运行以下代码时:
#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;
}