首页 > 解决方案 > 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 是零

标签: cprintf64-bit

解决方案


您所指的变量未初始化,并且包含一些来自内存的垃圾。编译器没有义务进行零初始化,因此是数字。在声明时将所有变量初始化为零,如下所示:

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

推荐阅读