#include <stdio.h>
#include <stdlib.h>
typedef struct{
int a;
int b;
}numStruct;
int main()
{
int i=2;
while(i){
if(1){
int s2;
printf("s2.1 %p\n",&s2);
}
if(1){
int s2;
printf("s2.2 %p\n",&s2);
}
i--;
}
return 0;
}
輸出:
s2.1 0060FEF8
s2.2 0060FEF4
s2.1 0060FEF8
s2.2 0060FEF4
想讓s2.1 s2.2 兩遍回圈的四個地址都不一樣要怎么改
uj5u.com熱心網友回復:
都不一樣嗎?我怎么看是兩個兩個一樣呢?這樣做有什么意義?要驗證什么內容?
uj5u.com熱心網友回復:
我寫a星尋路用的
我想讓它每次回圈創建一輪節點 不覆寫上一輪創建的
int c=1,*p,path[MAXSIZE*2];
int minf,minnum; //代價最小的點和編號
Open OList; //待定節點
InitOpen(&OList); //初始化待定節點表
Node startNode;
CreateNode(&startNode,s.x,s.y,NULL,s,f); //創建起點節點
map[s.x][s.y].pass=1;
Node nowNode=startNode;
while(1){
if(CanGo(nowNode.x-1,nowNode.y,map)){ //上
Node newNode;
Node curNode;
curNode=nowNode;
CreateNode(&newNode,nowNode.x-1,nowNode.y,&curNode,s,f);
AddOpen(&OList,&newNode);
}
if(CanGo(nowNode.x+1,nowNode.y,map)){ //下
Node newNode;
Node curNode;
curNode=nowNode;
CreateNode(&newNode,nowNode.x+1,nowNode.y,&curNode,s,f);
AddOpen(&OList,&newNode);
}
if(CanGo(nowNode.x,nowNode.y-1,map)){ //左
Node newNode;
Node curNode;
curNode=nowNode;
CreateNode(&newNode,nowNode.x,nowNode.y-1,&curNode,s,f);
AddOpen(&OList,&newNode);
}
if(CanGo(nowNode.x,nowNode.y+1,map)){ //右
Node newNode;
Node curNode;
curNode=nowNode;
CreateNode(&newNode,nowNode.x,nowNode.y+1,&curNode,s,f);
AddOpen(&OList,&newNode);
}
if(OList.length==0){
path[0]=0;
p=&path;
return p;
}
else{
for(int i=0;i<OList.length;i++){
if(map[OList.NodeList[i]->x][OList.NodeList[i]->y].pass==1){
MinusOpen(&OList,i);
i--;
}
}
minf=OList.NodeList[0]->f;
minnum=0;
for(int i=1;i<OList.length;i++){
if(minf>OList.NodeList[i]->f){
minf=OList.NodeList[i]->f;
minnum=i;
}
}
Node newNode;
Node curNode;
curNode=nowNode;
CreateNode(&newNode,OList.NodeList[minnum]->x,OList.NodeList[minnum]->y,&curNode,s,f);
nowNode=newNode;
map[OList.NodeList[minnum]->x][OList.NodeList[minnum]->y].pass=1;
MinusOpen(&OList,minnum);
}
if(nowNode.x==f.x&&nowNode.y==f.y){
Node *pathNode; //回溯路徑
pathNode=&nowNode;
while(pathNode!=NULL){
path[c++]=pathNode->x;
path[c++]=pathNode->y;
pathNode=pathNode->Parent;
}
path[0]=c-1;
p=&path;
return p;
}
}
uj5u.com熱心網友回復:
區域變數占據堆疊區記憶體,在行程執行時陳述句塊會及時分配和釋放。堆疊區記憶體向低位拓展,所以當陳述句塊執行時,會從堆疊頂地址向低位延伸若干個位元組數的地址區間。
這個地址區間將與一塊物理記憶體建立映射。
陳述句塊中所有的引數、區域變數、回傳值等內容都存在這塊區域中。
這個地址區間中的低位地址就是這個陳述句塊整體的記憶體地址,也就是新的堆疊頂地址。
其中區域變數所占地址區間是整個地址區間的某一小段,對應物理記憶體中的某一小塊。
當陳述句塊執行完畢的時候,其所占堆疊區記憶體被釋放,堆疊頂恢復到入堆疊前的地址。
所以理論上來說,同一級的陳述句塊一定是基于同一個堆疊頂地址向低位分配記憶體的。
那么它們當中區域變數的地址是可能重復的,但是它們對應的物理記憶體則不一定重復。
這個問題沒有任何意義!
uj5u.com熱心網友回復:
那就擴大它的作用域,不要定義區域(for)里的變數。可以考慮用節點陣列,這樣不用每次都創建。uj5u.com熱心網友回復:
改一下CreateNode轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/50769.html
標籤:C語言
上一篇:新人小白瑟瑟發抖,希望大佬求解
下一篇:qt絕對路徑為什么打不開檔案?
