【順序表】純C環境下,函式傳遞的指標指向報錯及解決
阿新 • • 發佈:2018-12-13
之前開始學順序表的時候,就沒有很好地弄懂,函式裡指標的傳遞這一塊,今天把錯誤範例和一些解決方式拿出來分析一下。
網上有很多掛羊頭賣狗肉的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; }