1樓:♂凡鳥
//你的**傳str的值進去帶不出來,如果對指標進行賦值一定要用更高一級的指標,否則就要返回值
//malloc()分配了新的記憶體給p,但是你原來函式中的p是複製了str的值進行操作,函式執行完之後p就找不到了,你的str並沒有得到p的值,同時你把p丟了,也沒有辦法**分配給p的記憶體。
#include
#include
#include
void getmemory(char **p)int main( )
或者:#include
#include
#include
char* getmemory(char *p)int main( )
2樓:匿名使用者
……malloc就是動態記憶體分配函式啊,你用它了不就是動態分配了嗎,而你說的程式崩潰?我編譯、執行都通過了啊,就一個警告資訊說malloc使用了old-style,這個無所謂。(我用的c-free 4.
1)至於free()對str操作危險,我覺得沒這一說。要說危險,只要使用malloc等跟動態記憶體相關的函式都危險……
恩,才注意到,原來有個引數傳遞的問題,你傳遞的是形參,沒能實現預定功能,樓上說的都對
#include
#include
void getmemory(char **p)int main( )
3樓:匿名使用者
必須將變數str的地址傳入函式,才能改變str的值這裡的str變數型別是char*,所以getmemory函式接受的引數型別是char**
#include
#include
void getmemory(char **p)int main( )
4樓:匿名使用者
這個malloc()是比較傻子的,就是從堆上分配記憶體,就是大小要自己制定,之後用free()釋放。現在基本已被new 和delete替換, 因為對於面對物件程式設計,有很多的自定義的類
,亦即抽象資料型別,而malloc()值返回void*的變數,就是所要分配記憶體的首地址,注意首地址是一個非常重要的量,無論對於多繼承中的子物件還是父物件的地址,還是陣列的首地址都是非常重要的東西,所以千萬要注意呦。有點跑題了,就是希望你能多懂一點。呵呵
mallco()是絕對不會知道他分配記憶體的用途的,比較傻, 所以被、new取代因為new和delete會呼叫相應的構造和解構函式之後在執行 operator new 和operator delete 釋放記憶體。
其實new 和delete就是malloc和free 的升級版本,對於 基本型別可以使用後者,但是分配記憶體的時候注意正確的強制轉換;如果要int* 型別就是要 (int*)malloc(...) 之後用free()釋放就可以。這個從heap上動態分配的記憶體就是要程式設計師負責釋放否則記憶體洩露。
在棧上的則不用,因為預設的都是auto型別的變數。好運。
5樓:匿名使用者
其實 很簡單 ,p開闢的空間並不等同於 str 所開闢的空間,也就是說當程式執行到getmemory(str)時,str根本就沒成功開闢一塊空間,所以當你想往這塊(你認為存在的)空間拷貝字串時,必然會出現問題。
c語言malloc問題
6樓:匿名使用者
每個變數都會有生命週期的,這個你該明白
*p是子函式的變數,在getmalloc結束的時候,生命週期結束,系統幫著釋放了這個申請的空間
所以,你這個沒有必要用子函式,直接在主函式中malloc即可你要是真的想要用子函式來申請的話,只能用全域性變數*p這樣延長p的生命週期
7樓:匿名使用者
c語言傳引數的方式應該是常識了,但是當引數涉及指標的時候還是不好理解……這裡出問題的原因就是給區域性變數p賦值沒有影響str2的內容……
8樓:曠若英
因為c語言函式呼叫是值傳遞,也就是當呼叫getmalloc(str2);時,p與str的值相同,指標的值相同只是意味著指向空間相同,但是p仍然是p,str仍然是str。在呼叫malloc時,對p重新分配空間,它的指向會發生變化(不是對原來的地址直接分配,而是分配好空間再來返回它一個分配的新地址。因為原來指向的隨機地址基本不可能能用)。
也就是p變了,str仍然指向垃圾空間。
9樓:
1. 函式返回, 堆疊釋放, 返回的指標指向記憶體垃圾, 所以是亂碼, 列印正確或者亂碼都有可能。
2. 函式呼叫分配記憶體指標並沒有返回(引數應該是二級指標),str2 沒有初始化, getmalloc 也沒有正確的返回值, 往裡面考東西,不crash才怪了。
c語言關於malloc的用法
10樓:專治**
malloc是開闢一個空間,然後把只想這個空間的指標轉換為與p相同型別指標,然後讓p指向這個空間,就可以存東西西了。很靈活,大程式這樣用超節省空間
11樓:匿名使用者
malloc是動態隨機分配記憶體空間的方法。
可以根據需要分配記憶體空間給程式使用
(char*)malloc(sizeof(char)*20)的意思是,動態分配空間為20個char型資料大小的空間。
並且將返回的指標型別強制轉換成char型指標。
c語言 malloc()函式 分配記憶體空間尺寸的問題
12樓:王斌隨
這個問題首先得從堆疊說起,一個程式一般分為三段:**段,資料段(靜態資料),和堆疊段。堆疊段儲存程式中的變數、程式傳遞的引數等(動態分配的變數儲存在堆中,靜態分配的儲存在棧中)。
堆疊的增長方式如下:
程式在執行的時候會預先分配堆疊空間,所以你的問題中不一定修改了不該修改的地方,有可能那裡本來就是空的。
再回到malloc這個函式上來,malloc主要負責分配空間,返回該空間的首地址。那為什麼申請空間為0,卻可以儲存7個字元呢?那是因為c語言的指標中並不檢查陣列的越界問題,不信的話,你可以這樣:
char ch[5],然後你去讀寫ch[6](printf或scanf),這樣是不會報錯的。但是我們在使用的時候,千萬別越界使用,因為這樣的程式是非常危險的,試想,如果越界使用的地址正好是一個作業系統的地址,那麼你一修改,系統就崩了。同時,c語言的這個機制被黑客廣泛地應用與緩衝區溢位攻擊,所以你非但不能越界使用指標,還得時刻考慮到指標(陣列)是否越界,以加強程式的安全性。
希望對你有所幫助。。。
13樓:樂跑小子
c語言中malloc是動態記憶體分配函式。
函式原型:void *malloc(unsigned int num_bytes);
引數:num_bytes 是無符號整型,用於表示分配的位元組數。
返回值:如果分配成功則返回指向被分配記憶體的指標(此儲存區中的初始值不確定),否則返回空指標null。void* 表示未確定型別的指標,void *可以指向任何型別的資料,更明確的說是指申請記憶體空間時還不知道使用者是用這段空間來儲存什麼型別的資料(比如是char還是int或者...
)功能:分配長度為num_bytes位元組的記憶體塊
注意:當記憶體不再使用時,應使用free()函式將記憶體塊釋放。函式返回的指標一定要適當對齊,使其可以用於任何資料物件。
關於該函式的原型,在以前malloc返回的是char型指標,新的ansic標準規定,該函式返回為void型指標,因此必要時要進行型別轉換。
例項:#include"stdio.h"
#include"malloc.h"//malloc()函式被包含在malloc.h裡面
int main(void)
sprintf(a,"%s","helloworld\n");//"helloworld\n"寫入a指向的地址
printf("%s\n",a);//輸出使用者輸入的資料
free(a);//釋放掉使用的記憶體地址
return0;}
14樓:匿名使用者
你何必糾結一定要分配使用者輸入字元數量長度的空間呢?開一個足夠大的陣列不就得了?
如果你一定要malloc準確的大小,你可以char *c;
char *s=malloc(100000*sizeof(char));//malloc一個足夠大的陣列,暫時儲存輸入
scanf("%s",s);
c=(char*)malloc(strlen(s)*sizeof(char));
strcpy(c,s);
free(s);//輸入結束後把輸入儲存,再把這個大陣列釋放
15樓:匿名使用者
malloc是給指標變數分配記憶體空間的函式命令正確使用:
分配的空間要能保證容下你想儲存的資料,不要和機器逗著玩(分配0空間,或少於自己實際需要的空間),如你上面的操作,表面上你程式執行沒有問題,可實際上你佔用了別人的地盤,只是當前你很幸運沒有使程式出現問題,但不保證一定不出問題!!
不再使用的指標,一定要free()來釋放空間!malloc 與free要配對使用,即:有malloc必要有free
關於malloc分配記憶體的問題
16樓:匿名使用者
一、*p是p指標中的值,不是地址。p才是地址。&i是指i變數所在的地址。
二、malloc函式按照其引數值在記憶體中分配相應的大小的空間,這個空間的首地址會返**用者,即p=這個地址。
17樓:發狂的蜜蜂
答1:不可能。省略a句,*p永遠是2
答2:都不是。malloc在記憶體中獲取了一段記憶體區域,然後將次記憶體區域的首地址賦值給p.
int *p;
p=(int*)malloc(2*sizeof(int));
*p=&i;//有問題,這句話錯誤。應該是 p=&i;
18樓:匿名使用者
問題1:你的兩次輸出是指兩次執行中不同嗎?
問題2:什麼叫「它指向的地址」,這裡的「它」是誰?
c語言問題 malloc函式的標頭檔案是什麼?
19樓:聽不清啊
stdlib.h 和 malloc.h 中都有malloc函式的。
20樓:與子如初見
malloc.h 或者 stdlib.h
c語言malloc問題
21樓:匿名使用者
p=(char *)malloc(sizeof(char)*(len1+1)); //這裡少分配了一個位元組,導致越界訪問了
malloc產生段錯誤怎麼回事??
22樓:匿名使用者
malloc產生段錯誤可能是如下原因:
1、指標非法,比如使用沒有初始化的指標(沒有為此指標指向的物件分配空間),或著free掉之後再次使用。
2、陣列訪問越界,訪問的元素下標超過陣列圍長3、快取溢位,對於這種while的程式,這個問題最容易發生,多此sprintf或著strcat有可能將某個buff填滿,溢位,所以每次使用前,最好memset一下,不過要是一開始就是段錯誤,而不是執行了一會兒出現的,這種情況的可能性就比較小。
malloc 向系統申請分配指定size個位元組的記憶體空間。返回型別是 void* 型別。void* 表示未確定型別的指標。
c,c++規定,void* 型別可以強制轉換為任何其它型別的指標。
在c語言裡面宣告指標並用malloc賦值與與直接宣告變
區別當然是有的 link n 申明結構體實體 n 結構體地址 link n 申明結構體指標 n malloc sizeof link 讓結構體指標指向申請的記憶體空間,需要free釋放 後者需要釋放並且申請大小靈活 希望對你有幫助 首先你得明白malloc函式的作用 malloc函式是在記憶體中找到...
C語言的問題C語言問題C語言問題
若有說明語句double p,a 則能通過scanf語句正確給輸入項讀入資料的程式段是 解 p a 將a的地址賦值給p,scanf lf p 從鍵盤獲取一個數值賦值給地址p指向的變數 所以選d 有函式fun的定義形式如下。int fun float f 則以下對函式fun的呼叫語句中,不正確的是 a...
C語言問題,c語言問題?
一 c語言規定總是從main 開始執行的 這個函式也叫 主函式 因此,你發來的題目中的 1 6 8 敘述都是錯誤的,都應該選擇f。二 第2題中,c語言對其資料在記憶體中所佔用的實際位元組數,隨著程式中宣告的資料型別以及資料的多少而變化,c語言本身並沒有明確規定。這題應該選f。三 第3題,c語言中強制...