C語言指針未初始化情況

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
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, 對其他編譯器需要驗證。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章