#include<stdio.h>
#include<stdlib.h>
#define NULL 0
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int i = 0;
int ptmp[2]={0};
*returnSize = 0;
for(i=0; i<numsSize-1; i++)
{
if((nums[i]+nums[i+1]) == target)
{
ptmp[0] = i;
ptmp[1] = i+1;
*returnSize = 2;
}
}
printf("@@@ =%p\n",ptmp);
return ptmp;
}
int main()
{
int a[3]={3,3};
int* pTemp = NULL;
int* p=NULL;
pTemp = (int*)malloc(sizeof(int)*2);
p = twoSum(a, 2, 6, pTemp);
printf("ptem =%p\n",p);
return 0;
}
uj5u.com熱心網友回復:
你認為怎么才算銷毀?uj5u.com熱心網友回復:
誠然,回傳一個地址,然后馬上銷毀該地址上的物件,有些吃飽了撐的,但僅此而已。顯示一個地址就是顯示一個數字而已,只有你企圖通過該地址訪問已銷毀物件時,后果才是未定義的。
uj5u.com熱心網友回復:
你沒搞清楚問題所在,只知道銷毀,函式完成后,所指向的記憶體空間也隨之被釋放掉,所以函式終止意味著區域變數的參考將指向不再有效的記憶體區域,但是如果函式的區域變數作回傳值時,會生成一個區域變數的拷貝用作回傳值,之后區域變數會被系統回收,所以函式不能回傳區域變數的地址,因為系統回收后,如果還回傳區域變數的地址的話,指標所指向的內容毫無意義。如:int a = 100;
int *p = &a;
cout << "p的地址= " << p << endl;
return p;
這樣訪問地址是不正確的,危險的,因為已經釋放掉了,但是因為可能這個區域還沒來得及被其他使用覆寫,所以有可能還能訪問以前的值,但是這種使用是錯誤的。
static char p[] = "this is test0\n";
return p;
char *p = "this is test1\n";
return p;
要是這兩種,test0保存在靜態存盤區,test1保存在只讀常量區,不在通常所說的堆疊記憶體中,所以回傳這個地址不會被回收,會正常回傳原來的值。
總結:在主函式呼叫子函式時,首先程式會跳轉到子函式的地址處,在子函式執行到最后return回傳值時,系統會把需要回傳的值存入暫存器中,然后經過“}”,子函式正式結束,在這個程序中,如果子函式有形參和區域變數,系統會為它們分配堆疊記憶體空間,等到函式運行完畢后,系統將會自動釋放在堆疊記憶體中給區域變數分配的記憶體中的資料。所以說單純的回傳值不會有問題,但是如果要回傳地址就會有問題。
至于釋放,釋放又不會把里面的值給修改了,那也太花精力了,只是那個值是不可控的,可能已經被修改了而已
uj5u.com熱心網友回復:
其實電腦開機后物理記憶體的每個位元組中都有值且都是可讀寫的,從來不會因為所謂的new、delete或malloc、free而被創建、銷毀。區別僅在于作業系統記憶體管理模塊在你讀寫時是否能發現并是否采取相應動作而已。作業系統管理記憶體的粒度不是位元組而是頁,一頁通常為4KB。uj5u.com熱心網友回復:
堆疊中的變數通常包括函式引數和函式里宣告的臨時變數。堆疊中的基本變數退出其作用域時,沒有誰執行一段代碼去釋放/銷毀/析構它所占用的記憶體,僅僅是沒人再去理會的留在當前堆疊頂上方的若干遺留下來可被后續壓堆疊操作覆寫的無用資料而已。
而堆疊中的類變數退出其作用域時,會自動執行其解構式,……
uj5u.com熱心網友回復:
回傳給main是一個地址,但是這個地址已經沒有意義了,因為陣列在函式呼叫完就結束了,自動釋放了。函式堆疊twoSum都釋放了。uj5u.com熱心網友回復:
get 到點了
uj5u.com熱心網友回復:
main函式訪問回傳的地址,訪問不到值。
uj5u.com熱心網友回復:
你的理解是不準確的,如果你知道區域變數在堆疊里面,如果你自己了解什么是堆疊并實作過堆疊這樣的資料結構。那么,因為區域變數在堆疊中,向函式中傳遞引數直接push ,銷毀資料呢,只要pop.區域變數的定義呢,只要把堆疊頂指標移動位置,就可以了
這些說的是基本技術背景。如果你了解這一些。
那么,push pop做了什么呢,push 不過是把資料復制到堆疊中,并把堆疊往上移動一個位置(實際x86機器,堆疊是往下走的,堆疊底在高位,壓堆疊則是把堆疊頂指標向下移動),pop呢其實除了把堆疊頂指標(sp暫存器)加1外什么都不做。仔細想一下就應該知道。清空堆疊的操作就是把堆疊頂指標指向堆疊底。就可以。那么原來在記憶體中的資料,該在哪里還在哪里。不過是它們在堆疊頂指標的下部,如果再一次呼叫函式,把那個記憶體的單元直接拿過來用就是了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/256032.html
標籤:C語言
上一篇:關于學習C語言中遇到的困惑。
下一篇:大佬求助!
