同型別指標賦值失敗,C語言同型別指標賦值簡單問題

時間 2025-04-13 19:45:17

1樓:網友

應該是這一句導致的問題:node* start = node*)malloc(10000)。全域性變數的初始化的值應該為乙個常量,而malloc返回值迅隱是不定的,編譯器在編譯時無法斷言start的初始值是多少,於是就自作主張的用0的代替了。

這應該屬於全域性變數和區域性變數的初始化的差異所在的地方。

此外,使用輪棚linux下gcc編譯語句:struct node *start = struct node *)malloc(10000)(函式體外)時會導致如下編譯錯誤:錯誤:

初始值設定元素不是常量。而如果將該語句移動到函式體內,則可以編譯通過。從你寫的**看,你畝桐廳應該用的vc,我想這應該是編譯器的實現差異。

你可以把p、q、start的指標值都printf出來,看看是不是都是0。

2樓:匿名使用者

現在這麼看沒什麼大問題。

p=start;

這塊的**粘上來備指核看逗埋看仿掘吧。

q=p;

c語言同型別指標賦值簡單問題

3樓:帳號已登出

這個程式本身是沒有任何錯誤的。

之所以「c++環境下可以執行,單純的c環境不行」,是因為c語言規定,乙個語句塊內所有的變數,要在語句塊開始的地方定義,不能放到語句塊的中間定義。而c++沒有這個規定。

int*pint2=pint1;這句塊中定義了乙個指標變數pint2,而且是在語句塊中間定義的,所以在「單純的c環境」比如經典的中編譯肯定是通不過的。解決辦法就是把這個變數放到開始處定義。如:

#include

#include

int main(void)

完畢。 ps:按《c++ primer》裡的說法,c++去掉這個規定是正確而且合理的。

4樓:網友

定義指標的時候最好不要同時賦值。int*pint1=#這樣容易出問題,這樣改:int *plnt1;

plnt1 = num;

5樓:網友

void main(void)

在我印象中,括號裡是空的,什麼都不用寫。

指標的值可以賦給同型別的指標嗎?

6樓:巴扎嘿

這個是不需要的,指標算是內建型別。同型別的指標都可以直接賦值。效果就是左值指標的指向和右值指標的指向同一塊記憶體。

如果你要寫智慧型指標,涉及到記憶體深拷貝的話,賦值是需要重新實現的。但是這是的智慧型指標雖然表現有點像指標,其實它是物件型別。

指標的賦值問題

7樓:網友

首先指標最好不要做賦值運算,int *p,*q; q=p;p是乙個位址就是把p的位址賦給指標p,兩個值都是16進位數,但是這樣做的話兩個指標指的是同乙個位址並且沒有被在其位址位之內放int型的整數;

int a,*p,*q; p=q=&a;是在上面的基礎上對其位址位置的記憶體放置了乙個a(,但是這個數是多少是,是垃圾資料);

int a,*p,*q; q=&a; p=*q;在指標q和指標p所指位置上的記憶體中放置的是同乙個a(int數,隨機的)*與&是逆運算,假如p是指標,*p代表的就是p所指記憶體中儲存的數,a代表乙個int型的數,那麼&a代表的就是這個數所指的位址值;p等價&(*p);

int a=20,*p; *p=a;*p在這裡代表的是乙個間接變數,你可以吧*p當成乙個變數,這個變數比普通變數好用……

int a=b=0,*p; p=&a; b=*p;同上的道理,對於=號是從右往左運算的所以b=*p並不知道*p的值,*p的值是隨機的;

int a=20,*p,*q=&a; *p=*q;這個玩的是具體的int型值,對於p和q所指的位址並不做任何操作,都是隨機的位址;

int a=20,*p,*q=&a; p=q;同上面不一樣的是p與q指向了同乙個位址,實際上是把q指向的位址賦給了p;

int p,*q; q=&p;這個就不用說了吧。

加上一句,雖然*p很好用,但是開始時由於其指向不明確,是隨機位址,濫用的話會造成記憶體管理混亂,建議在用指標前最好用malloc和new函式開闢動態記憶體。*

8樓:網友

指標是個存著位址的變數,因為我們每定義乙個變數,記憶體就會給他分配空間,那麼每個變數必須會有乙個儲存他的地方,我們稱為位址,他指向誰,裡面就存著誰的位址。如題*p=a;

此時p裡面存的是a的位址(記住這一點),還可以用取位址符&獲取變數的位址,如&a;表示的是a的位址。變數的值可以用*號獲取。* 後面加乙個位址,表示這個位址裡面的數值(也記住,很重要)

定義3個原則。

a * 後面只能跟位址, *p 表示引數的值。

b &後面只能跟變數。 &a 表示引數a的位址。

c 』=『 是賦值,為了程式的穩定,我們預設只允許同型別的引數進行賦值(若不同類也會賦值,但是執行結果會出錯)

int *p,*q; q=p; //對的,因為p,q都是指標,可以相互賦值 依據 a,c原則。

int a,*p,*q; p=q=&a;//對的,p,q指標表示位址,根據b原則,&a也是位址,因此可以進行賦值。

int a,*p,*q; q=&a; p=*q;//錯的,q =&a 是對的,但是p =*q 是錯的,根據原則a,c,*q是值,p是位址,與原則c衝突。

int a=20,*p; *p=a;// 對的,他們都表示值。

int a=b=0,*p; p=&a; b=*p;//對的,p = &a 原則bc ,b = *p 原則ac

int a=20,*p,*q=&a; *p=*q;// 對的,初始時q得到a的位址,*p和*q都是表示值,符合原則c

int a=20,*p,*q=&a; p=q;//對的,原則bc

int p,*q; q=&p;// 對的,原則bc

祝你進步,指標自己琢磨下,會明白的!

9樓:gta小雞

請分清「指標本身的值」和「指標指向的位址中的值」這兩者的區別。指標本身的值就是位址。

int a = 2;

int *p = &a;

p = 100; //試圖將指標本身的值修改為100,即令指標p指向記憶體位址100的位置,這是未定義行為。

p = 100; //將指標p指向的位址中的值修改為100,即將a的值修改為100

10樓:匿名使用者

int a =0, *p = &a;

p = 100; 這個是合法的,修改指標指向記憶體空間內容。

int *p =4;直接把整數賦值給指標變數,由於位址4一般是非法位址,訪問的時候會出現問題,所以一般不會把數值賦值給指標。

11樓:偶珈藍祥

是在定義時用,表示定義乙個指標變數p指向a,*q=&a在非定義階段是不正確的。q=&p 很正確,q在這裡是指標變數,它存的是乙個位址,而&p正好是乙個位址。

12樓:倒黴熊

int *p,*q; q=p;

int a,*p,*q; p=q=&a;

上面的賦值是正確的)

int a,*p,*q; q=&a; p=*q;

int a=20,*p; *p=a;

p=*q不對,應該是p=q,*p=a;不對,p根本沒有指向任何位置。)

int a=b=0,*p; p=&a; b=*p;

int a=20,*p,*q=&a; *p=*q;

a=b=0這種初始化方式不對,*p=*q不對,p根本沒有指向任何位置)

int a=20,*p,*q=&a; p=q;

int p,*q; q=&p;

這組也是正確的)

13樓:網友

int *p,*q; q=p; // 雖然q未被初始化,p = q賦值也沒有任何意義,但合理合法。

int a,*p,*q; p=qa; // 這也是合理的。

int a,*p,*q; q=&a; p=*q; // p和q都是int型別的指標,所以p = *q是錯誤的,原因是型別失配。

int a=20,*p; *p=a; // 對的。

int a=b=0,*p; p=&a; b=*p; //對的。

int a=20,*p,*q=&a; *p=*q; // 注意到int a=20,*p,*q=&a;中*p,*q=&a中的是「,」如果改為「;」就對了。

int a=20,*p,*q=&a; p=q; // 問題與上面的相同。

int p,*q; q=&p; // 對的。

顯然,只有第一組是對的。

14樓:

int *p,*q; q=p; //指標賦值給指標允許。

錯誤,指標只需要變數a的首位址,故應該寫成p=q=a錯誤同上條 p=*q錯誤 不同型別賦值。

int a=20,*p; *p=a; //*p=a錯誤,應該是p=a. 非法給多重指標賦值。

錯誤,b末定義。

錯誤錯誤。錯誤,同第二條。

15樓:dudu榮

感覺應該是第乙個正確,83813236這是個c/c++的***。

16樓:從慮居躍蠢贅餃

水長流的陪伴,慶幸的是,走了這。

結構體指標兩種賦值方式怎麼會出錯

17樓:

pid *sptr = &volpid;

定義 pid 型別的指標並初始化為 volpid 變數的位址,注意,這裡不是「賦值」,而是「初始化」。

pid *sptr; *sptr = &volpid;

給 sptr 指向的變數賦值。

錯誤1:型別不同,*sptr 是指向了變數,就是變數本身,而 &volpid 是變數的位址,乙個是變數,乙個是變數的位址。

錯誤2:sptr 沒有初始化,給其指向的變數賦值,可能造成崩潰。

錯誤3:即使 sptr 已初始化,也不能為其指向的變數賦值,因為該變數型別是 struct,按 c 語言的型別劃分,屬於「聚集型別(aggregation)」,聚集型別不能整體賦值。

改成這樣才正確:

pid *sptr; sptr = &volpid;

定義 sptr 指標,然後賦值為 volpid 變數的位址。

指向字串的指標能不能賦值給同型別的指標?

18樓:

你要明白,指標就是儲存所指內容的位址的變數。

在型別匹配的情況下,你可以通過把要指向的位址賦值給指標,來讓指標指向任何你需要的資料。

所以指向字串的指標自然是可以賦值給同型別的指標的。

c++語言,用指標編寫的乙個類似於陣列賦值的很小很小的程式,結果不是很對,**出錯?

19樓:網友

賦初值並沒有錯,錯在你取array裡值的時候,沒有把arrary還原到陣列的初始位置,加上。

array -= 4;就可以了,程式如下:

# include

using namespace std;

int main()

array -= 4;

for(i=0;i<=3;i++)

cout<

這是給指標賦值的問題

20樓:網友

你的程式中指標指向了不合法的地方。

在程式中有這句話。

for (int i = 0;i<5; i++)其中*(a+i) = m[i];

表示將剛才輸入的m陣列賦值到從變數p開始的一組連續的記憶體中。

但是,只有p的記憶體是合法的,其他的記憶體都是非法的。

這樣賦值,很可能將值賦給不能變動的記憶體位址,從而造成程式錯誤。

給指標所指的位址賦值,必須保證記憶體合法。

合同型別包括哪些,合同型別都有哪些

合同的類別包括 第一,雙務合同和單務合同。第二,有償合同和無償合同。第三,諾成合同與實踐合同。第四,要式合同與不要式合同。第五,為訂約當事人利益的合同與為第三人利益的合同。第六,主合同與從合同。第七,本合同與預約合同。第八,定式合同。不同類別的合同具有不同的性質,在現實生活中,也經常出現乙個合同分別...

指標指向不同型別資料時,指標變數佔用多大空間

在c中,指標只有3種 指向簡單變數的,指向結構體變數的,指向函式的.他們的大小和指向的型別無關,基本都是一樣的,等於地址寬度.在16位的地址的系統裡,用 段 偏移 來表示一個地址,當只用偏移的時候 段內 稱為near指標,當段偏移都用的時候 跨段 稱為far指標,far指標佔用空間大於near指標....

c語言相同型別的變數佔用記憶體一定一樣嗎

不一定。機器型別不同,同樣都是整型,佔用記憶體可能不同。比如16位機,整型可能是16位,32位機,整型可能是32位。跟採用的編譯器也有很大關係,有的編譯器把整型編譯為16位,有些編譯為32位。 錯過 一樣,你定義變數型別的時候記憶體空間就已經分配了,而且是固定大小的記憶體!不過有的程式軟體規定的儲存...