一般类型如int,char,float等定义的变量a,那么调用a时用的就是a的值,而结构体变量呢?书上说结构体变量名不是结构体变量的首地址,为了测试调用结构体变量名是什么,本人写了个小程序
#include<stdio.h> typedef struct{ char name[20]; int value; }Student; int main() { Student a={"abc",1}; printf("%d %s %d\n",a,a.name,a.value); printf("%x %x %x",a,&a.name,&a.value); return 0; }
然而第一个输出结果后面两个值为null和0,与预期的不符合,本人本以为后面两个会输出abc和1的,然后本人逐步修改,发现把前面输出的a去掉,让它只输出两个值,这回正确了。
第二个输出一样,加上a后面两个就是0,去掉就是正常的地址,这是为何呢?
直接调用输出结构体变量到底是什么意义?或它根本没有意义?
以下是测试图
解决方案
10
%x 是输出整数值的格式,所以会把结构体变量a当作一个整型值,结果就是强制转换a的前4个字节为整型值, 原因是name里的指针地址是递增的,而变量的存储方式是低字节序的,所以int的16进制值是636261,接着是会把接着的2个整型值(分别是4个字节,name有20个字节)输出,0,0, 编译器会把a当作一个变量的集合,而不是一个单独的变量.
#include <stdio.h> #include <iostream> typedef struct{ char name[20]; int value; }Student; int main() { // a=0x61,b=0x62,c=0x63,0x0,0x0,,,, Student a={"abc",1}; printf("%s %d\n",a.name,a.value); printf("%x,%x\n",&a.name,&a.value); printf("%x,%x,%x\n",a); std::cout << &a << "," << &a.name << "," << &a.value << std::endl; return 0; }
abc 1 28fee8,28fefc 636261,0,0 0x28fee8,0x28fee8,0x28fefc
10
printf 输出结构体 就是整个结构体复制堆栈中,起码现在是这么做的
结构体在内存是什么样子,在堆栈中也还是什么样子。
可能唯一的差距,就是结构体尾部,补上多少字节。
结构体中字符串数组,就是把字符序列,按照对应的格式输出
#include<cstdio>
using namespace std;
int main()
{
struct data{
char a[4];
int b;
};
data d{“abc”,10};
printf(“%#x-%#x\n”,d);//%x当作整型输出,大小端输出是不同的
printf(“0x%08x-0x%08x\n”,d);//
结构体在内存是什么样子,在堆栈中也还是什么样子。
可能唯一的差距,就是结构体尾部,补上多少字节。
结构体中字符串数组,就是把字符序列,按照对应的格式输出
#include<cstdio>
using namespace std;
int main()
{
struct data{
char a[4];
int b;
};
data d{“abc”,10};
printf(“%#x-%#x\n”,d);//%x当作整型输出,大小端输出是不同的
printf(“0x%08x-0x%08x\n”,d);//
return 0;
}
///输出
///0x636261-0xa
///0x00636261-0x0000000a