64位环境中的printf / snprintf行为

问题描述 投票:-1回答:3

使用0在64位环境中打印%lu正在给出140733193388032输出。

我在64位环境中打印8次0,直到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 is a, 0 is b , 0 is length, 4195408 is breadth, 140737346312864 is len, 4195893 is bre, 140733193388064 is hei, 140733193388032 is zero
0 is a, 0 is b , 0 is length, 0 is breadth, 0 is len, 0 is bre, 140733193388032 is hei, 140733193388032 is zero

使用Initializing struct和local:

#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, 140733193388032 is hei, 140733193388032 is zero
0 is a, 0 is b , 0 is length, 0 is breadth, 0 is len, 0 is bre, 140733193388032 is hei, 140733193388032 is zero
c printf 64bit
3个回答
1
投票

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

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

0
投票
#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, %uc is hei, %u is zero\n",a,b,sz.length, sz.breadth, sz1.len, sz1.bre, 
   sz1.hei, 0);
   printf("%u is a, %u is b , %u is length, %u is breadth, %u is len, %u is bre, %u 
   is hei, %u is zero",0,0,0,0,0,0, 0, 0);
  }

此输出全为0

在gcc中使用-wformat,修复警告,然后打印全0


0
投票

您的代码中有2个问题:

  • 您正在打印未初始化的数据,行为未定义,输出是不可预测的。
  • sz1.hei有类型unsigned char,你不应该使用格式%lu或你应该把这个值转换为(unsigned long)sz1.hei
  • 0有类型int,你应该通过0L0UL格式%lu在你的第二个printf

使用初始化程序,此代码在32位(和64位Windows)中的行为与预期相同,因为unsigned long在平台上为32位,与unsigned int大小相同。

您必须为每个转换说明符传递具有预期类型的​​printf参数,否则行为未定义。你应该增加警告级别(例如gcc -Wall -Wextra -Werror)让编译器警告你这些错误和许多其他错误。

这是一个更正版本:

#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, (unsigned long)sz1.hei, 0UL);
    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",
           0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL);
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.