1樓:匿名使用者
首先標頭檔案應該包含
#include,有malloc()的宣告
#include,strcpy()
這個小問題
這個程式並沒有像你想的那樣執行,能編譯連結,但執行時崩潰
原因是這樣的:
當傳遞str給getmemory()時候:
首先:給形參p開闢一塊記憶體(四位元組,指標),這塊記憶體和實參變數所在(不是所指向)的記憶體是兩個獨立的記憶體,沒有任何關係,先記住這個,後面會用到,形參num也分配,這個引數不是問題重點,就不多說了
其次:虛實結合,把實參str中內容賦值到形參變數的記憶體區中(即,把null賦值到形參變數的記憶體中),注意區分記憶體單元的地址和記憶體單元中的內容!
接著:用malloc()分配所要的記憶體區,並將首地址存放在形參記憶體中,即,形參記憶體中的內容由原來的null變為剛分配記憶體的首地址,但實參變數所在記憶體中的內容並沒有改變,還是null!(因為形參實參變數所在的記憶體是相互獨立的,上面提到了),這是問題的關鍵
最後:getmemory()返回,在getmemory()中形參變數是動態分配,函式返回時,會被自動收回,形參p所在的記憶體被收回,剛剛存在這裡用malloc分配的記憶體區首地址也隨之消失,實參中的內容還是原樣(null)
但是到這裡程式還正常,沒有崩潰,但留下的隱患
在執行strcpy(str,"hello"); 時候,實際上執行的操作是:
把字串常量"hello"拷貝到str指標指向的記憶體區
而str指向的記憶體區地址為null(=0),咣噹,崩潰!
這個地址是不允許寫的
另外,如果在void getmemory(char *p,int num)
判斷p是否為null反而弄巧成拙,並不能達到目的,因為對於這個例子傳進來的一定是null
你可以在main()中把str列印出來看看
現在這個**是看不到什麼的
解決辦法:
void getmemory(char **p,int num)
在main()中:
getmemory(&str,100);
或者:char * getmemory(int num)
在main中:
str=getmemory(100);
對於這個問題需要說明一點:
malloc()在getmemory()內部分配了記憶體,那這部分記憶體的作用域是不是就是在這個函式體內呢?答案不是的。用malloc分配的記憶體要用free釋放才會收回,所以getmemory()返回後,malloc()分配的記憶體並沒用釋放,所以可以放心使用由malloc()分配的記憶體。
對於第二個解決辦法中執行return p在後面處理過程是這樣的先將p值存入暫存器,然後該函式退出(區域性變數p所在記憶體已經釋放)並返回到呼叫點str=getmemory(...);把暫存器中的值賦值給str,就是用malloc非配的記憶體區基址。
對於這兩種解決辦法都可以在
main()中用free(str)釋放這塊記憶體。
2樓:匿名使用者
#include
void getmemory(char *p,int num) //這個函式的作用是通過引數的數值來分配記憶體,並由第一個引數的字元指標指向
int main()
補充:結果是向str指標指向的內容空間拷貝字串hello並且加上'\0'結束符
也就是說建立了一個由str指標指向的字元陣列改程式並沒有任何可以顯示的結果
3樓:爨室
void getmemory(char *p,int num)
應該判斷下p是否為null
其他的樓上已經說了
4樓:倉建伊
申請記憶體,然後將hello複製到str中
c語言中,strcpy為什麼會出現錯誤
5樓:匿名使用者
void main()
6樓:匿名使用者
你給p分配空間,str還是個野指標,然後你給str賦值,當然會死掉了!
修改如下:
void main()
c語言題,對strcpy運用錯誤的是??
7樓:水主沉浮
要往一個地址裡copy字串,這個地址需要被分配了合適大小的記憶體,並且這記憶體是可以寫入的。
str1和str2都被分配了記憶體,在棧區分配的。
str3只是一個指標,沒有被分配記憶體,當然也不能往裡面存東西了。
其實str4也不能存東西,即答案d也錯誤,因為str4指向的是常量區,只能讀取,不能修改。
8樓:
恩,826說的對。
char str1//建立char陣列,建立陣列時同時進行了初始化,可以預設最後一維的引數。
char str2[8] //建立char陣列char* str3 //建立char指標變數char* str4 = "string" //建立char指標變數,並且初始化指標變數指向常量字串"string"
這麼解釋,你是不是就可以明白了
9樓:儒雅的點點丶
你可以這樣替換一下看.
a答案可以替換成str1[7],代表的是str1一建立就分配了7個位元組的空間。
b答案str2[8]代表的是,str2一建立就在棧空間分配8個位元組。
c答案*str3這個字元指標沒有指向任何記憶體,所有你要往裡面填東西是不可以的,指標就好比**號碼如果你沒有啟用它(記憶體),那麼撥出去的就是空號,是打不通的。
d答案也一樣的,因為這個**號碼已經啟用了,所以可以撥號。
這樣解釋應該能理解了吧
10樓:匿名使用者
不用逐個解釋的,只有第三個沒有申請記憶體
11樓:竹殤海荼蘼
cccccccccccc
c語言中的clock 問題,c語言中的問題?
就是while clock now 的意思,注意後面還有個分號,這是一個空迴圈。因為clock會返回當前時間,now是一個過去的時刻,所以這個條件的意思是 當前時間比那個時刻晚的多少小於clocks per sec,也就是如果時間相差還不到clocks per sec就一直迴圈。因此這個迴圈的意思就...
C語言中return的問題,C語言中return的用法疑問
檢測的迴圈有點問題,根本進入不了迴圈 linshi 1,這個是進入迴圈的條件,只有1的時候才能進入迴圈其實判斷素數的子函式有經典的 int s int n for linshi number 1 linshi 1 linshi 這個條件錯了,至少也是 linshi 2 if linshi 1 如果前...
c語言中遇到的問題,C語言中遇到的問題!
printf 系列函式輸出格式萬用字元 d 表示將輸出值以整數對待 c 表示以 ascii 字元對待 f 表示以32bit浮點數對待。舉例如下 printf d v 此時不論變數 v是何種型別,都輸出對應的整數值,比如 v是一個指標,則輸出指標地址。printf c v 此時不論變數 v是何種型別,...