c - 64 位环境中的 printf/snprintf 行为
问题描述
0
在 64 位环境中%lu
打印输出140733193388032
。
我0
在 64 位环境中打印 8 次,直到第 6 次打印值0
,最后 2 次打印140733193388032
。
#include <stdio.h>
struct size {
unsigned long length;
unsigned long breadth;
};
struct pad {
unsigned long len;
unsigned long bre;
unsigned char hei;
unsigned char pad[7];
};
int main() {
unsigned long a;
unsigned long b = 0;
struct size sz;
struct pad sz1;
printf("%lu is a, %lu is b , %lu is length, %lu is breadth, %lu is len, "
"%lu is bre, %lu is hei, %lu is zero\n",
a, b, sz.length, sz.breadth, sz1.len, sz1.bre, sz1.hei, 0);
printf("%lu is a, %lu is b , %lu is length, %lu is breadth, %lu is len, "
"%lu is bre, %lu is hei, %lu is zero",
0, 0, 0, 0, 0, 0, 0, 0);
}
输出:
140737488347824 是 a,0 是 b,0 是长度,4195408 是宽度,140737346312864 是 len,4195893 是 bre,140733193388064 是 hei,140733193388032 是零 0 是 a,0 是 b,0 是长度,0 是宽度,0 是 len,0 是 bre,140733193388032 是 hei,140733193388032 是零
使用初始化结构和本地:
#include <stdio.h>
struct size {
unsigned long length;
unsigned long breadth;
};
struct pad {
unsigned long len;
unsigned long bre;
unsigned char hei;
unsigned char pad[7];
};
int main() {
unsigned long a = 0;
unsigned long b = 0;
struct size sz = { 0 };
struct pad sz1 = { 0 };
printf("%lu is a, %lu is b , %lu is length, %lu is breadth, %lu is len, "
"%lu is bre, %lu is hei, %lu is zero\n",
a, b, sz.length, sz.breadth, sz1.len, sz1.bre, sz1.hei, 0);
printf("%lu is a, %lu is b , %lu is length, %lu is breadth, %lu is len, "
"%lu is bre, %lu is hei, %lu is zero",
0, 0, 0, 0, 0, 0, 0, 0);
}
输出:
0 是 a,0 是 b,0 是长度,0 是宽度,0 是 len,0 是 bre,140733193388032 是 hei,140733193388032 是零 0 是 a,0 是 b,0 是长度,0 是宽度,0 是 len,0 是 bre,140733193388032 是 hei,140733193388032 是零
解决方案
您所指的变量未初始化,并且包含一些来自内存的垃圾。编译器没有义务进行零初始化,因此是数字。在声明时将所有变量初始化为零,如下所示:
memset(&sz, 0, sizeof(sz))
或所有成员分开。
提供片段后编辑
我试图对所有变量进行零初始化,如下所示:
#include <stdio.h>
struct size
{
unsigned long length;
unsigned long breadth;
};
struct pad
{
unsigned long len;
unsigned long bre;
unsigned char hei;
unsigned char pad[7];
};
int main()
{
unsigned long a = 0;
unsigned long b = 0;
struct size sz = { 0 };
struct pad sz1 = { 0 };
printf("%lu is a, %lu is b , %lu is length, %lu is breadth, %lu is len, %lu is bre, %lu is hei, %lu is zero\n",a,b,sz.length, sz.breadth, sz1.len, sz1.bre, sz1.hei, 0);
printf("%lu is a, %lu is b , %lu is length, %lu is breadth, %lu is len, %lu is bre, %lu is hei, %lu is zero",0,0,0,0,0,0, 0, 0);
}
我得到以下输出:
0 is a, 0 is b , 0 is length, 0 is breadth, 0 is len, 0 is bre, 0 is hei, 0 is zero
0 is a, 0 is b , 0 is length, 0 is breadth, 0 is len, 0 is bre, 0 is hei, 0 is zero
推荐阅读
- mysql - MySql:如何在单个“\”反斜杠上拆分字符串
- css - 实现 Google 自定义搜索时覆盖 CSS 样式
- java - 如何使用 Dart 加密视频文件?
- c# - C# discord bot 在我的服务器中获取成员数
- c - 如何在 vs code 中安装和使用 Openmp
- php - 将多个提交按钮重定向到不同的页面
- java - 在java中调用类的get方法
- sql-server - 为 TOP 或 FETCH 子句行计数参数提供的行数必须是整数
- ios - 如何在Objective-C中像Twitter一样显示预览
- php - 您的系统中缺少请求的 PHP 扩展 ext-iconv *。安装或启用 PHP 的 iconv 扩展