【发布时间】:2015-04-14 11:39:04
【问题描述】:
我有一个这样的简单程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
int numberOfDays;
char name[10];
} Month;
int main(void)
{
const Month months[12] = {
{ 31, {'J', 'a', 'n'} },
{ 28, {'F', 'e', 'b'} }
};
printf("%zu\n", strlen(months[0].name));
printf("%zu\n", sizeof(months[0].name));
printf("%zu\n", strlen(months[1].name));
printf("%zu\n", sizeof(months[1].name));
return 0;
}
输出是这样的:
3
10
3
10
我明白为什么 sizeof(months[i].name) 会打印 10,但为什么 strlen 在这种情况下会返回正确的值?
我的想法是,strlen 一直计数到第一个 '\0',但 char name[3] 数组不是以空值结尾的。据我了解,这应该是未定义的行为?它只是偶然起作用吗?
我想知道上面months[12]数组中的内存布局是什么。
【问题讨论】:
-
错误。这不是UB。结构的其余部分被初始化为零。
-
对不起,我的坏人。在结构中写了
char name[10],但在问题中我谈到了char name[3]。两者都有效,这让我很惊讶。 -
@Max 请不要以使已经提供的答案看起来脱离上下文的方式编辑问题。谢谢。
-
在您编辑之前更有意义 -
sizeof结果。
标签: c initialization