C語言NULL指標問題,C語言空指標是怎麼回事

2022-12-21 06:56:07 字數 5474 閱讀 8900

1樓:匿名使用者

不知道你用的系統和gcc的版本是什麼?在我所使用的linux工作站以及freebsd工作站上均未出現此問題,輸出均為"(null)"字串,在soliras系統上測試,兩個結果均為段錯誤,沒有出現你所說的現象。

出現段錯誤的原因有:

1、 引用乙個包含非法值的指標、例如空指標。

2、 未得到正確的許可權的時候進行訪問,例如往唯讀的記憶體位址寫資料。

3、 記憶體越界,例如陣列越界,變數型別不一致等。

所以這個程式出現段錯誤問題很明顯是由第一原因引起的,而程式輸出(null)個人認為應該是gcc所做的優化處理。

2樓:

因為char *p = null; 是表示此指標沒有指向任何位址空間。 他只是乙個指標。

3樓:匿名使用者

0在賦值給指標是乙個值,編譯器解釋時則把這個0作為了非法位址給指標,這是系統不能接受的,並不是像你程式1中的0一樣的。

4樓:義昀欣

我來替樓主解答一下吧。

先說錯誤,segment fault叫做段錯誤,一般是由於你的程式訪問了錯誤的記憶體位址,比如位址0。位址0是作業系統使用的記憶體位址,顯然,你的程式超出了本身的位址空間,在有的系統上用指標訪問超出你自己的程式位址空間的行為是被禁止的。因為這很危險。

gcc在這一點上做得很好,會提醒你。

--------------------------------4樓也沒看懂問題... 我的輸出格式是%s,printf應該會把0作為位址而不是'\0'吧?

*************************=我認為這裡的確把0當作了位址。按理說,位址0在這裡是不允許訪問的,比如你把0改成1就會出錯。這裡沒有出錯,列印null,應該是編譯器定義的一種行為,我感覺沒有太多意義。

5樓:匿名使用者

程式1: 在c語言中int 跟char 可以相互轉換 int型的0 就是字元型的null 這個可以查閱asc碼 例如字元'a' 就是int的97

程式2: *p定義乙個指標變數,不能賦值為0 指標變數只能指向位址,例如&a

c語言空指標是怎麼回事

6樓:風若遠去何人留

空指標指的就是null

也就是0指標

指標的含義 是乙個位址。 而0位址是非法位址。對這個位址進行賦值 或者取值 就會出現空指標錯誤

在實際程式設計中,經常把指標初始化為空指標, 在訪問的時候進行判斷, 如果為空,那麼就是還沒有正確賦值的, 應該避免訪問。

7樓:匿名使用者

當你使用了乙個未初始化的指標,就會報這個錯誤。

請教c語言中null指標的概念

8樓:

null指標指向的位址為0x00000000,其實內在中位址的範圍是0x00000000~0xffffffff,位址中的每乙個位元組都可以儲存東西。但是系統出於某些原因考慮,0x00000000這個位址不用。所以返回指標為null一般代表錯誤,很多函式返回其它值是正確的位址。

你想想,如果這個位址也利用,那麼如果函式執行錯誤,如strstr,在字串中沒有找到子字串,返回null代表沒有找到子字串,如果null也可以存東西,那麼沒有找到子字串是沒有辦法表達的。

c語言 關於空指標問題

9樓:匿名使用者

這個沒有問題,程式的問題出在了else if也要接條件表示式,因為else if也是if,不能直接加{}.

for(c = abs(a-b); c

指標的意思是可以直接對裡面的資料進行修改,雖然其位址不變,但是內容可以修改,直接換一下指向就可以了。

10樓:

對的。因為從定義int *y, int *w, int *d可以看出y,w,d都是指標,指標是用==null來判斷的。

11樓:留下痕跡的人生

這個函式是通過返回值來判斷函式是否正常執行if(y == null && w == null && d == null) 語法上沒有任何錯誤

最好這樣寫

if((y ==null) && (w==null) && (d==null)) // 這樣寫的好處就是增加可閱讀性,避免出現

運算子優先順序的問題

12樓:匿名使用者

1. if(y == null && w == null && d == null)這個語法上是對的,但是邏輯上不對,應該任何變數為空指標都不能執行,所以改為if(y == null || w == null || d == null)

2. if...else... 的用法問題,else後並不是一定要再加if的。而且if後面一定要有條件。

3. 迴圈只要是收斂的就可以用,但是要記得初始化

a=a初值;

b=b初值;

epsilon =較小值;

for(c = abs(a-b); c

4. 要修改y,w,d所指向的值,所以要用指標。否則直接用int y,w,d的話只能修改函式內部變數,不能帶出函式。(形參和實參的概念)

程式修改如下:

int converttime(int days, int *y, int *w, int *d)

else if(y == null || w == null || d == null)

else}

c語言指標的賦值問題

13樓:大野瘦子

指標在用要注意初始化,例如:

int *p;

p為指標,位址是未知的,如果直接賦值

*p=a;這樣編譯可以通過,但是會產生警告,p的位址是隨機分配的,這樣對未知的位址賦值很危險,可能會覆蓋掉某些重要資料,所以避免這種危險,在定義指標時注意初始化,也就是賦值。

可以int *p=&a;

或者int *p;

p=&a;

然後再對p進行操作

有錯。注意大小寫,還有

int a=9;

int *p;

p=&a;//這個是指標指向a

*p=8;

這樣就對了。

指標的賦值

int *p;

int a;

int b[1];

p = &a;

p = b;

指標的賦值,「=」的左運算元能夠是*p,也能夠是p。

當「=」的左運算元是*p時,改變的是p所指向的位址存放的資料;

當「=」的左運算元是p時,改變的是p所指向的位址。

陣列的變數名b表示該陣列的首位址,因此p=b;也是正確的

同型別的指標賦值:

int val1 = 18,val2 = 19;

int *p1,*p2;

p1 = &val1;

p2 = &val2;

p1 = p2;   //注意啦,p1指向了val2,而沒有指向val1

備註:字串與指標的初始化和賦值

初始化:

char *cp = "abcdefg"; //這個初始化過程,是將指標cp指向字串的首位址,而並非傳遞字串的值。由於,在c語言裡面,沒有總體處理乙個字串的機制

賦值:cp = "abcdefg";

*cp=」abcdefg」 ;//錯誤!字串常量傳遞的是它的首位址,不能夠通過*cp改動該字串的值,由於該字串為常量,而它僅僅是簡單的將指標指向該字串常量。

14樓:林聲飄揚

有錯注意:用指標變數前,必須對指標變數賦值如:int i, *p1;

p1=&i;

再如:int a, b;

int *p1, *p2;

*p1=10; *p2=100;

但指標變數未賦值,即指標指向未知位址,這樣是錯誤的因此:絕對不能對未賦值的指標變數作「指向」運算。

int a=9,b;

int *p=&b;//必須加上這一句

*p=a;

*p=8;

這樣就不會產生錯誤

15樓:匿名使用者

注意大小寫!還有

int a=9;

int *p;

p=&a;//這個是指標指向a

*p=8;

這樣就對了。

16樓:七先生是遊戲鬼才

這個還是比較複雜的,你可以學習一下

17樓:匿名使用者

p=&a//把a的位址給指標p

18樓:匿名使用者

語法上沒錯,但可能出現警告,破壞程式其他資料

19樓:渾濃強浩然

p就是乙個指標,他指向乙個位址,而&p就是p剛才所指向的具體位址,*p是p指向位址裡面的東西。也就是值。*p=&a的意思是把a的位址給了*p,這樣的話p就指向

(指向a的位址)的位址。對指標賦值必須是int*p=null;或者int

*p;p=null。

c語言空指標的問題

20樓:匿名使用者

這是結構體型別,取成員變數的偏移量的方法,不是取位址操作,是c規定好的正確使用格式

21樓:匿名使用者

指標其實是乙個存在乙個位址中的數,這個數是真正資料的位址。既然指標是乙個數,那麼它可以存放在記憶體中任何地方,通常不會存在位址0的位置,所以習慣用0表示空指標。其實記憶體位址0是可以存放指標的。

所以上述程式可以通過,只要系統沒有阻止對位址0的讀取。

c語言 空指標

22樓:

空指標是其值為null或0的指標,在下認為稱之為「指向」null或「指向」0的指標都是錯誤說法,因為若有int a,*p=&a;,則稱指標p指向了a,並不能說指標p指向了&a,只能說p的值是&a,不然就大錯特錯了。沒有指向(即沒有賦值),或指向的目標已銷毀了的指標稱為懸浮指標(可能人們據說的野指標也是它吧)。int *p=null,*n=null,p=n是不是有意義呢?

單純看這裡是沒有意義的,但指標是變數,如果保證指標n不變化且是null,那n就是空常指標,一點意義都沒有。否則的話p=n保證在生存期間指標p是跟隨n變化的。這就是p=n存在的意義。

23樓:

int *p;p=&a空指標也分配了空間它裡面是隨機的碼,我認為int *p和int*p=null是一樣的。p=n就是p和n都指向了乙個n內的隨機數。

24樓:魂歸紅魔

個人理解,在c語言中空指標是指向null的指標,而在c++中則是指向位址為0的指標,雖然在實際應用中,基本一致,但是還是有點差別。另外,空指標本身是有位址的。在c++中是一樣的,在c中就變成了null==null的問題了,這就是仁者見仁智者見智的問題。

C語言指標問題,C語言指標問題

這個演算法最後的時候 p和q都是指向a的,在最後這個時候a的結構是,q之前的是所有的除了版 之外權 的字元。q之後的都是原來a裡面的資料,對於這個時刻是髒資料。最後把q指向的那個位置賦值為 0可以在遍歷a的時候,不遍歷到髒資料,而這個時候p正好指向的就是 0,所以 q p 迴圈結束條件是 p 0,因...

c語言如何給指標引數賦值為null

用指標的引用即可.例如 int memnull int m 在另乙個函式裡呼叫它 int a memnull a memnull執行完之後a的位址就被修改為null了.或者可以用指標的指標 intmemalloc int param 呼叫的時候這樣呼叫 int a memnull a 這樣memnu...

C語言這個F函式再指標C語言指標問題

28f為傳值呼叫。所以f中的修改不影響main中變數的值。輸出的還是原始值。即 4,3,5 選d29 a 4b a q b w q b q null a q 0 由於q已經賦值為null,再對 q賦值會引起程式崩潰。這個不對 b w p 指標間賦值,正確。c p a 也就是a a 正確。d p w ...