c - 当我将指向 unsigned int 的指针转换为 unsigned long long 指针时,为什么我会看到一个更大的值?

标签 c

下面程序的输出是:

数据:18446721190124690902 892374

数据:892374 892374

当我将变量“a”作为指针传递时发生了什么?我希望这两个函数打印相同的值。

#include <stdio.h>

void func(unsigned long long * dat) {
        printf("dat : %llu %u \n",*dat,*dat);
}

void func1(unsigned long long dat) {
        printf("dat : %llu %u \n",dat,dat);
}

int main(void)
{
        unsigned int a;
        a = 892374;
        func((unsigned long long *) &a);
        func1((unsigned long long) a);
        return 0;
}

最佳答案

您遇到了未定义的行为,因为 unsigned int 的大小小于 unsigned long long。就 func 而言,dat 指向的内存长度为 8 个字节,而实际上它只有 4 个字节 - 所以它正在访问包含随机值的额外 4 个字节.对于 printf 的 %u 部分,您将它转换回一个无符号整数,这样它就不会使用额外的 4 个字节,因此您得到了正确的值。

第二个函数可以正常工作,因为它将值转换为 unsigned long long,因此大小差异不是问题。

关于c - 当我将指向 unsigned int 的指针转换为 unsigned long long 指针时,为什么我会看到一个更大的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44155408/

相关文章:

c++ - 是否有以相反顺序填充缓冲区的 memset 函数实现?

c - C 代码的 R 内联编译在 Windows 上失败

c - 打印字符串时出现问题

c - 用户错误: Reset failed (STM32373 ARM4)

c - 8字节内存可以输入4字节吗?没有损失?

C:从函数返回矩阵

c++ - 如何查明长函数返回的位置

c - 打开文件太多 : File IO in C on Windows

C如何根据地址移动二维数组

c - 如何读取文件并根据不同的段落写入不同的文件