下面程序的输出是:
数据: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,因此大小差异不是问题。
我是一名优秀的程序员,十分优秀!