字节对齐

今天在为struct 分配内存的时候,发现有鬼!

1
2
3
4
5
6
7
8
void test(){
struct Node{
int age;
char *color;
char sex;
};
printf("%d",sizeof(struct Node));
}

猜猜它会输出什么呢 ? 如果按照预期计算,在64位windows中它所占用的内存是 4+4+1=9 Byte 妥妥的没有问题, 可它实际输出的值12 Byte,平白无故多了3字节? 之前我也是不解,直至看了咕叽咕叽的文章。才知道有字节对齐规则,原因是为了方便CPU取数据!
emm 然后就引发了下面的这个问题…

结构体或对象中如何声明变量可能更省内存

应为存在字节对齐,所以变量的声明顺序不同,所占内存也可能不同!
例如:

1
2
3
4
5
6
7
8
void test(){
struct Node{
int age;
double price;
int weight;
};
printf("%d",sizeof(struct Node));
}

它占用多大内存呢? 答案是 24Byte!

然后换一下变量声明顺序:

1
2
3
4
5
6
7
8
void test(){
struct Node{
double price;
int age;
int weight;
};
printf("%d",sizeof(struct Node));
}

仅仅占用了16Byte! 所以如有必要声明变量时最好还是从大到小是更好的选择! 不过,我其实也读过一两本书呢,对于这些问题书中却从未提及。

住手,这不是Java!

好久没写C了,在用C写数据结构时,遇到了一个很基础的问题!不过我把锅甩给了Java
看代码:

1
2
3
4
5
6
Node_list * createNode(int data){
Node_list node;
node.data=data;
node.next=NULL;
return &node;
}

我本是想函数放回Node_lsit的指针,不过我可能忘记了堆栈概念了,它确实会放回Node_list的指针,不过这个指针是空的!以为node是栈变量,方法出栈后,内存自然被free了!所以我得到的是一个空指针!

为了验证我的想法,我又进行了以下尝试:

1
2
3
4
5
6
Node_list * createNode(int data){
static Node_list node;
node.data=data;
node.next=NULL;
return &node;
}

我确确实实得到了指向Node_list的一个指针!

所以后将程序修改为:

1
2
3
4
Node_list * listp=(Node_list *)malloc(sizeof(Node_list));
listp->data=data;
listp->next=NULL;
return listp;

直接在堆上分配内存! 这样每次调用函数都会得到新的Node_list指针了!

评论