C结构上意外的内存转储

时间:2018-04-13 12:30:51

标签: c linux

设置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]);

我的问题是为什么两条标记的行显示为字节的大小而不是两个

1 个答案:

答案 0 :(得分:0)

我希望Enum定义为raw_ptr,并且您的环境char似乎已签名(请注意:char数据类型的签名是实现定义的)。

因此,在char表达式中,(unsigned int)raw_ptr[i])已投放到signed char,但在此之前,该值会提升为unsigned int,这也意味着必须延长该符号到适当的数据类型大小。 然后在调用之后,打印不可能只使用2个字符,因此忽略了宽度说明符。