设置C结构如下:
DECLARE
v_long_text CLOB;
BEGIN
DBMS_LOB.CREATETEMPORARY(v_long_text,true);
DBMS_LOB.APPEND(v_long_text, dbms_random.string('U', 20000));
DBMS_LOB.APPEND(v_long_text, dbms_random.string('U', 20000));
DBMS_LOB.APPEND(v_long_text, dbms_random.string('U', 20000));
DBMS_LOB.APPEND(v_long_text, dbms_random.string('U', 20000));
DBMS_LOB.APPEND(v_long_text, dbms_random.string('U', 20000));
DBMS_LOB.APPEND(v_long_text, dbms_random.string('U', 20000));
DBMS_LOB.APPEND(v_long_text, dbms_random.string('U', 20000));
INSERT INTO my_table VALUES (v_long_text);
END;
在使用以下代码初始化之前逐字节转储它:
struct test {
char name[20];
};
我得到以下输出:
struct test real_name;
raw_ptr = (char*) &real_name;
for(i=0; i < sizeof (real_name); i++)
printf("raw_ptr [0x%016lx]\t0x%02x\n",
(unsigned long int)&raw_ptr[i],
(unsigned int)raw_ptr[i]);
我的问题是为什么两条标记的行显示为八字节的大小而不是两个?
答案 0 :(得分:0)
我希望Enum
定义为raw_ptr
,并且您的环境char
似乎已签名(请注意:char数据类型的签名是实现定义的)。
因此,在char
表达式中,(unsigned int)raw_ptr[i])
已投放到signed char
,但在此之前,该值会提升为unsigned int
,这也意味着必须延长该符号到适当的数据类型大小。
然后在调用之后,打印不可能只使用2个字符,因此忽略了宽度说明符。