C专家编程学习中的笔记
台可以实际进行测试,得出相应结果。)
struct node_tag{
char test0;
short test1;
int test2;
char test3;
int test4;
short test5;
};
sizeof(struct node_tag) = 20;虚拟机也是20。
struct node_tag{
char test0;
int test1;
double test2;
char test3;
double test4;
};
sizeof(struct node_tag) = 32;虚拟机是28。这个是分配单元的区别,VC++6.0以8字节,虚拟机上是以4字节。
从这里可以知道,在编写结构体时,我们可以恰当的组织数据类型的顺序,可以节省存储空间。我想,结构体我应该比较明白了吧。
P164
看到共用体,扩展测试:
同理关于共用体,《C语言程序设计》<谭浩强>(第三版)P309
共用体变量所占的内存长度等于最长的成员的长度。这是错误的。
union test{
char a[10];
int i;
}u;
sizeof(u) = 12.
union test{
char a[10];
double i;
}u;
sizeof(u) = 16.
同样,要求字对齐。
union test{
char a[17];
double i;
}u;
sizeof(u) = 24.
union test{
char a[17];
double i;
}u;
sizeof(u) = 20.注意,以8字节为分配单位。
enum test{sun,mon,tue,wed,thu,fri,sat} workday;
sizeof(workday) = 4;
workday只是前面7个值中的某一个,只占4个字节。
P164
union { char a[10];
int i;
} u;
int *p = (int*) &(u.a[1]);
*p = 17; /* the misaligned addr in p causes a bus error! */中文版上的相应代码看不清楚,下了一个英文版的
通过在虚拟机上的测试和VC++6.0上的测试,并未出现所说的错误。我想可以是现在的编译器和作者当时的编译器有所不同。
测试代码如下:
#include "stdafx.h" //虚拟机中直接是#include<stdio.h>
union test{
char a[10];
int i;
}u;
int main(int argc, char* argv[])
{
int *p = (int*) &(u.a[1]);
*p = 17;
printf("union = %d\n",&u);
printf("&(u.a[1]) = %d\n",&(u.a[1]));
printf("*p = %d\n",*p);
return 0;
}
VC++6.0结果是:
union = 4339408
&(u.a[1]) = 4339409
*p = 17
虚拟机上结果是:
union = 134518272
&(u.a[1]) = 134518273
*p = 17
P164
int *p = 0;
*p = 17; /* 引起一个段错误 */
编译不会报错,但运行时会报错。段错误是由于内存管理单元(负责支持虚拟内存的硬件)的异常所致,而该异常则通常是由于解除引用一个未初始化或非法值的指针引起的。如果指针引用一个并不位于你的地址空间中的地址,操作系统便会对此进行干涉。
int *p = 0;这里是指针的声明,p的值是地址,将0赋给p。这里赋值只能是0,不能是其它值,否则会报错:'initializing' : cannot convert from 'const int' to 'int *'。这什么只能是0?因为0就是NULL,代表指针指向一个空值。
#include "stdafx.h"
int main(int argc, c
har* argv[])
{
int *p = 0;
printf("&p = %d\n",p);
//printf("*p = %d\n",*p);
/* 有这一句的话
编译没有错误,没有警告。
运行结果:
&p
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库C专家编程看书笔记(6)在线全文阅读。
相关推荐: