我试图统一一个ARM项目(特别是运行Linux 2.6.33.3的i.MX27 CPU,用GCC 4.3.2编译)的SQLite交互方法.作为其中的一部分,我创建了一个带有union的结构,该结构用于保存绑定到预准备语句的值.
#define SQLITE_DATA_CHARACTER_STRING_MAX 1024 typedef struct { int data_type; union { int integer; double floating_point; unsigned char character_string[SQLITE_DATA_CHARACTER_STRING_MAX]; }; }sqlite_data;
原来,这是int
,float
,char
.我想用long long
,double
和char
.但是,这似乎导致了一个问题.如上所述,以下代码生成可预测的输出:
int data_fields = 15; int data_fields_index = 0; sqlite_data data[data_fields]; LogMsg(LOG_INFO, "%s: Assigning", __FUNCTION__); for(data_fields_index = 0; data_fields_index < data_fields; data_fields_index++) { data[data_fields_index].data_type = (100 + data_fields_index); data[data_fields_index].integer = (1000 + data_fields_index); LogMsg(LOG_INFO, "%s: data[%d] - %d; type - %d", __FUNCTION__, data_fields_index, data[data_fields_index].integer, data[data_fields_index].data_type); }
其输出是这样的:
Assigning data[0] - 1000; type - 100 data[1] - 1001; type - 101 data[2] - 1002; type - 102 data[3] - 1003; type - 103 data[4] - 1004; type - 104 data[5] - 1005; type - 105 data[6] - 1006; type - 106 data[7] - 1007; type - 107 data[8] - 1008; type - 108 data[9] - 1009; type - 109 data[10] - 1010; type - 110 data[11] - 1011; type - 111 data[12] - 1012; type - 112 data[13] - 1013; type - 113 data[14] - 1014; type - 114
但是,如果我只进行一次更改(给出integer
类型long long
),它就会崩溃.那么,以下变化:
typedef struct { int data_type; union { long long integer; double floating_point; unsigned char character_string[SQLITE_DATA_CHARACTER_STRING_MAX]; }; }sqlite_data;
生成此输出:
Assigning data[0] - 1000; type - 0 data[1] - 1001; type - 0 data[2] - 1002; type - 0 data[3] - 1003; type - 0 data[4] - 1004; type - 0 data[5] - 1005; type - 0 data[6] - 1006; type - 0 data[7] - 1007; type - 0 data[8] - 1008; type - 0 data[9] - 1009; type - 0 data[10] - 1010; type - 0 data[11] - 1011; type - 0 data[12] - 1012; type - 0 data[13] - 1013; type - 0 data[14] - 1014; type - 0
我已经尝试将它们去实现它们,使用#pragma pack(6)
并将该数组放在堆上,所有这些都具有相同的结果:int
工作,long long
但不是.
这里发生了什么?
你没有告诉printf()
期待long long
.使用%lld
您的格式字符串代替%d
.