1. 程式人生 > >【順序表】純C環境下,函式傳遞的指標指向報錯及解決

【順序表】純C環境下,函式傳遞的指標指向報錯及解決

之前開始學順序表的時候,就沒有很好地弄懂,函式裡指標的傳遞這一塊,今天把錯誤範例和一些解決方式拿出來分析一下。

網上有很多掛羊頭賣狗肉的c語言教程,函式是引用呼叫的,就很誤導人。

Wrong:

typedef struct
{
    int *elem;
    int length;
}sq;
int main()
{
    sq *l;
    l->elem=(int *)malloc(sizeof(int)*1005);
    l->length=0;
    printf("%d\n",l->length);
    return 0;
}

它會報錯:warning: 'l' is used uninitialized in this function。是說l不合法。

分析:

elem:int型指標,指向:存放【目標資料1】的首地址。

l->elem:sq型指標,指向:存放【存放目標資料1的首地址】的首地址

malloc:這個函式原意是,在記憶體開闢一段地址,這段地址的首地址存在返回的那個指標變數裡。但本案中我們返回到了存放指標變數的地址裡,意思是在這個地址後面開了一堆空間。這樣的空間無法合理使用,也是不合法的。

Right:

1.

typedef struct
{
    int *elem;
    int length;
}sq;
int main()
{
    sq l;
    l.elem=(int *)malloc(sizeof(int)*1005);
    l.length=0;
    printf("%d\n",l.length);
    return 0;
}

2.

這種形式也合法,意思是malloc返回給結構體指標變數,那麼就是在首地址後新增多個結構體。但此時elem仍是單個的,只是隨結構體而複製多份了而已。

typedef struct
{
    int *elem;
    int length;
}sq;
/*typedef struct
{
    int elem[1005];
    int length;
}sq;*/
int main()
{
    sq *l;
    l=(sq *)malloc(sizeof(sq)*1005);
    l->length=0;
    printf("%d\n",l->length);
    return 0;
}