strcpy問題,C語言中,strcpy為什麼會出現錯誤

2022-03-05 14:59:22 字數 2933 閱讀 2674

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是何種型別,...