1. 程式人生 > >學會使用malloc,學會對指標賦值

學會使用malloc,學會對指標賦值

先看一個程式,其實這是我編的一個不算小的程式裡面的片斷,把曾經遇到的問題寫出來:

#include<stdio.h>

int main(void)
{
char *a;
//a=(char *)malloc(20);
a=gets(a);
//scanf("%s",a);
//getchar();
puts(a);
getchar();
return 0;   
}

這個是我在windows下面除錯的一個程式,用的是dev c++ 4.9 ,編譯是沒有問題的,執行的時候就是直接出現windows特有的垃圾介面,“工程1.exe 遇到問題需要關閉。我們對此引起的不便表示抱歉。”,就是叫你關了他。

分析之:其實把這個程式拿到linux下面的gdb一下就可以曉得執行到gets的時候,就會告訴你segments fault,很簡單程式所用的資料段出了問題,cplus裡面其實也降到過,就是說沒有初始化的指標不要賦值,段出現了覆蓋的問題,因為指標在沒有初始化的時候,他是沒有一個明確的地址的,你要是直接賦值就會導致指標地址與其他的程式所佔的地址的衝突,最後就會出現段錯誤。

解決方法:

把指標化成陣列,*a改成a[],我不喜歡用陣列,所以我用第二種方法,給指標分配地址:

malloc就可以輕鬆的解決這個問題。

今天再補充一點:

malloc是動態的分配,地址並不固定的,而陣列在定義和初始化的時候就已經固定了,可以看一個程式:

#include <stdio.h>
#include <malloc.h>
int main(void)
{
 char *p="asdfasdf";
 char *q;
 q=(char *)malloc(20);
 q=p;
 printf("%s/n",p);
}

p的地址還是可以賦給q的,即便沒有malloc分配,初始化的時候就應該知道,指標的地址其實也算是動態的,比如這麼定義和換地址:

#include <stdio.h>
#include <malloc.h>
int main(void)
{
 char *p="asdfasdf";
 char *q="ddddddddd";
 //q=(char *)malloc(20);
 p=q;
 printf("%s/n",p);
}
仍然可以的。

但是陣列就不可以了,因為他的地址開始申明和賦值的時候,就已經固定了,不可以變了的。

#include <stdio.h>
#include <malloc.h>
int main(void)
{
 char p[20]="asdfasdf";
 char q[20];
  p=q;
 printf("%s/n",p);
}

編譯的時候會報錯,D:/hehe/hehe/zhi/zhi.cpp(8) : error C2106: '=' : left operand must be l-value。

呵呵記得就行了。

但是有一點,char *p可以直接在定義的時候給值,比如char *p=“asdf”,或者char *p;p=“asdf”;這個其實是一種繫結的方法,動態的吧。

但是下面這樣就不可以了,char *p;scanf("%s",p);因為p的位置不確定的,得在scanf("%s",p);之前malloc或者new一下。

char 型指標可以直接給字串,但是int型的就不可以啊,比如int *p=123;就是不對了,這樣吧,int *P;再malloc或者new一下一個確定的地址,然後就*p=123就可以了。

int賦值是給*p=123,而char型的就是給首地址p=“asdf”,呵呵。