面试题答案
一键面试- 设计union结构:
- union可以让不同类型的成员共享同一块内存空间,从而实现一定程度的数据“压缩”。假设我们的复杂数据结构包含
int
、float
和char
数组,我们可以设计如下的union:
- union可以让不同类型的成员共享同一块内存空间,从而实现一定程度的数据“压缩”。假设我们的复杂数据结构包含
#include <stdio.h>
#include <string.h>
union ComplexData {
int intValue;
float floatValue;
char charArray[4];
};
- 操作逻辑及代码示例:
- 由于union成员共享内存,在使用时要注意同一时间只能使用其中一个成员。下面是一个简单的示例展示如何使用这个union:
int main() {
union ComplexData data;
// 使用intValue成员
data.intValue = 10;
printf("intValue: %d\n", data.intValue);
// 使用floatValue成员(此时intValue的值会被覆盖)
data.floatValue = 3.14f;
printf("floatValue: %f\n", data.floatValue);
// 使用charArray成员(此时floatValue的值会被覆盖)
strcpy(data.charArray, "test");
printf("charArray: %s\n", data.charArray);
return 0;
}
- 原理解释:
- 在上述代码中,
union ComplexData
定义了一个联合体,其中intValue
、floatValue
和charArray
共享同一块内存空间。这块内存空间的大小取决于最大成员的大小,在这个例子中,int
和float
通常是4字节,charArray
长度为4,也是4字节,所以整个union占用4字节。 - 当给
intValue
赋值时,数据存储在共享的内存空间中。之后给floatValue
赋值,原来intValue
的数据就被覆盖了,因为它们共享同一块内存。同理,给charArray
赋值也会覆盖之前floatValue
的数据。这种特性使得union在某些场景下可以有效节省内存空间,但使用时需要小心确保同一时间只有一个成员是有效的。
- 在上述代码中,
如果是C++语言,基本思路类似,代码如下:
#include <iostream>
#include <cstring>
union ComplexData {
int intValue;
float floatValue;
char charArray[4];
};
int main() {
union ComplexData data;
// 使用intValue成员
data.intValue = 10;
std::cout << "intValue: " << data.intValue << std::endl;
// 使用floatValue成员(此时intValue的值会被覆盖)
data.floatValue = 3.14f;
std::cout << "floatValue: " << data.floatValue << std::endl;
// 使用charArray成员(此时floatValue的值会被覆盖)
std::strcpy(data.charArray, "test");
std::cout << "charArray: " << data.charArray << std::endl;
return 0;
}
原理和C语言中的union是一样的,都是成员共享内存空间,同一时间只有一个成员是有效的。