对于数组T arr[10]
,sizeof arr
返回数组占用的字节数(即sizeof(T) * 10
在这种情况下)。但是,swprintf
期望wchar_t
目标缓冲区中的数量作为其第二个参数。
swprintf() 函数应将输出后跟空宽字符放在从 *ws 开始的连续宽字符中;不应写入超过 n 个宽字符,包括一个终止的空宽字符,它总是被添加(除非 n 为零)。
下面的测试代码显示了当您简单地使用sizeof a
并且源wchar_t
字符串比目标wchar_t
缓冲区长时如何破坏金丝雀值。
#include <wchar.h>
#include <stdio.h>
#define ARRLEN(a) (sizeof(a) / sizeof(a[0]))
int main() {
struct S {
int i;
wchar_t a[4];
int j, k, l;
};
struct S x = {}, y = {};
wchar_t b[] = L"984567";
int rcx, rcy;
printf("Start\n");
printf("%ld %ld\n", sizeof(x.a), sizeof(x.a[0]));
rcx = swprintf(x.a, ARRLEN(x.a), L"%ls", b);
rcy = swprintf(y.a, sizeof(y.a), L"%ls", b);
printf("%#x %ls %#x %#x %#x %d\n", x.i, x.a, x.j, x.k, x.l, rcx);
printf("%#x %ls %#x %#x %#x %d\n", y.i, y.a, y.j, y.k, y.l, rcy);
printf("%ls\n", b);
printf("end\n");
return 0;
}