#include
#include
#include
typedef struct node Node,*P_Node;
struct node
{
int data;
P_Node next;
int *p2int;
};
int main(void)
{
int a;
int *p_int;
Node node;
P_Node p_node;
printf(" a=%d , p_int=%p ,\n Node.data=%d ,node.nex=%p , Node.p2int=%p\n", \
a,p_int,node.data,node.next , node.p2int);
printf("p_node=%p \n",p_node);
printf("&node=%p\n",&node);
p_node = (P_Node)malloc(sizeof(Node));
printf("=====after malloc the space!======\n");
printf("p_node=%p\n",p_node);
printf("p_node->data=%d p_node->next=%p\n" , p_node->data ,p_node->next);
printf("p_node->p2int=%p\n",p_node->p2int);
int *arr = (int*)malloc(sizeof(int)*3);
printf("arr[0..2] = %d ,%d,%d\n",arr[0],arr[1],arr[2]);
return 0;
}
输出结果:
a=32767 , p_int=0x0 ,
Node.data=0 ,node.nex=0x0 , Node.p2int=0x0
p_node=0x0
&node=0x7fff59f9fc50
=====after malloc the space!======
p_node=0x7fb8cb4038f0
p_node->data=0 p_node->next=0x0
p_node->p2int=0x0
arr[0..2] = -1951222467 ,32767,-1900194516
运行环境:
mac +gcc4.7
分析, 栈上由编译器开辟的空间,a初值为“乱数”,指针p_int为0。在栈上开辟的结构体,为初始化时,其成员变量无论原始类型或指针类型值都为0;
在堆上用malloc开辟的空间,成员变量值为0;开辟的连续空间,如 int *arr = (int*)malloc(sizeof(int)*3) 每一个元素值为“乱数”
分析这个问题的意义: 在C语言中布尔运算,0为假,非0为真。 故而有 while(p->next){...}这类写法。
注意,初值是0 还是“乱数” 完全由编译器决定, 上述讨论只限于 GCC, 对其他编译器需要验证。