今天在运行程序时,遇到一个问题,偶尔程序会出问题,而且出问题时,结构体里的指针都是很奇怪的地址,而且整形变量也是奇怪的负值,如下:
(gdb) p value
$1 = {lval = -8070450165744038711, dval = -1.2883345903292424e-231, counted = 0x9000005555558cc9, str = 0x9000005555558cc9, arr = 0x9000005555558cc9, obj = 0x9000005555558cc9,
res = 0x9000005555558cc9, ref = 0x9000005555558cc9, ast = 0x9000005555558cc9, zv = 0x9000005555558cc9, ptr = 0x9000005555558cc9, ce = 0x9000005555558cc9, func = 0x9000005555558cc9,
ww = {w1 = 1431669961, w2 = 2415919189}}
正常情况下,地址如下:
$2 = {lval = 93825000612256, dval = 4.6355709523549613e-310, counted = 0x555555d521a0 <zend_empty_array>, str = 0x555555d521a0 <zend_empty_array>,
arr = 0x555555d521a0 <zend_empty_array>, obj = 0x555555d521a0 <zend_empty_array>, res = 0x555555d521a0 <zend_empty_array>, ref = 0x555555d521a0 <zend_empty_array>,
ast = 0x555555d521a0 <zend_empty_array>, zv = 0x555555d521a0 <zend_empty_array>, ptr = 0x555555d521a0 <zend_empty_array>, ce = 0x555555d521a0 <zend_empty_array>,
func = 0x555555d521a0 <zend_empty_array>, ww = {w1 = 1440031136, w2 = 21845}}
两个地址明显有区别。
是什么原因导致这种情况呢?根据猜测,可能是赋值时,复制了栈上的没有初始化的内容,于是,就写了一个简单的程序测试测试一下test.c:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef union _zend_value {
char * pValue;
unsigned int n;
unsigned long l;
} zend_value;
int main(int argc, char **argv)
{
zend_value zend;
zend_value * pzend;
pzend = (zend_value *)malloc(sizeof(zend_value));
return 0;
}
使用命令 gcc -g test.c -o test,编译并且可执行。
使用gdb命令调试,查看变量内容如下:
可以看到指针的初始化的内容和非指针初始化的内容是不一样的,如果定义了结构的变量没有初始化,就直接使用其中的内容会到导致严重的问题。
当然,不管什么变量,为了避免出错,最好养成好的习惯,在定义之后都初始化一下,这样可以避免可能出现的奇怪的错误。