#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
} Node,*LinkList;
LinkList Create_LinkListFromHead()
{
LinkList h;
Node *L;
int n;
printf("共設定節點個數");
scanf("%d",&n);
L=(Node*)malloc(sizeof(Node));
scanf("%d",&L->data);
L->next=NULL;
h=L;
n--;
while(n>0)
{
L=(Node*)malloc(sizeof(Node));
scanf("%d",&L->data);
L->next=h;
h=L;
n--;
}
return h;/*標注*/
}
void PrintList(LinkList h)
{
LinkList cur;
cur=h;
while(cur!=NULL)
{
printf("%d ",cur->data);
cur=cur->next;
}
}
main()
{
LinkList h;
h=Create_LinkListFromHead();
PrintList(h);
}
標注位置去掉,好像會多一個節點出來,多出來的節點的值為0,為什么?如果去掉了,他回傳給主函式的值是什么?
uj5u.com熱心網友回復:
暈,夠狠的,回傳堆疊記憶體LinkList h; 這個h是堆疊內變數,也就是記憶體在堆疊里,函式呼叫結束,堆疊記憶體就釋放了,所以回傳的h是也指標
uj5u.com熱心網友回復:
看錯了,h是指標啊,賦值為L了uj5u.com熱心網友回復:
每次生成方法堆疊的時候,都會分配回傳值區域的,return的回傳值就被設定在這個區域里,所以不寫return,它可能就是垃圾資訊。https://www.cnblogs.com/youngforever/articles/3167642.html
uj5u.com熱心網友回復:
如果是垃圾資訊的話,那他后面還可以正常運行啊,輸出也大部分都是對的,就是前面多了0,垃圾資訊的話后面的輸出應該也是亂七八糟的吧
uj5u.com熱心網友回復:
看了鏈接的帖子說了嗎,這個回傳值是暫存器eax的值,是不確定的。因為回傳值是個指標,只要這個指標不發生記憶體非法訪問錯誤,就能夠運行,只是運行的結果不對而已。uj5u.com熱心網友回復:
第一個問題:我覺得可以。沒看到多了個節點。至少看你運行的結果
第二個問題:
uj5u.com熱心網友回復:
看是看了,沒怎么看懂。。。我剛開始學的,那結果好像就跟正確的多了一個0,如果是不確定的,那怎么會這么相似呢?那個0是怎么多出來的?不好意思,問的比較多。。。
uj5u.com熱心網友回復:

return h <=> mov eax,dword ptr [h]
uj5u.com熱心網友回復:

h = Create_LinkListFromHead();
<=>
call Create_LinkListFromHead (062111Dh) //Call 調函式
mov dword ptr [h],eax //mov賦值
uj5u.com熱心網友回復:
不好意思,我是小白,剛開始學的,不是很看得懂這些。。。能講解一下嗎?謝謝
uj5u.com熱心網友回復:
VS的話,標注處下斷點,
運行斷下來后,打開匯編頁面,打開暫存器頁面。
看它return h <=> mov eax,dword ptr [h] 之后。eax的值。
點不了次單步除錯就會到
mov dword ptr [h],eax //mov賦值
程序中一直注意eax的值。
你把eax理解為一個存盤空間就行,或者理解為一個變數吧,也可以
uj5u.com熱心網友回復:
這不是c、c++標準定義的行為在不同的編譯器上會有不同的結果,甚至根本就不會編譯通過
研究它沒有多大的 意義
從匯編語言講, 函式的回傳值是放在EAX暫存器當中
沒有顯著的return陳述句,看執行到結束的時刻,匯編代碼的EAX里面放的是什么了
uj5u.com熱心網友回復:


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/117285.html
標籤:新手樂園
上一篇:visual studio 2019安裝后,visual studio installer可以卸載嗎?
下一篇:鏈表
