⑴ c語言,假設我現在准備用malloc函數為一個字元串開辟一個空間
這樣弄都行:
char *str=(char*)malloc(20);
或
char *str=(char*)malloc(sizeof(char)*20);
因為sizeof(char)就等於1。
⑵ C語言 malloc()函數 分配內存空間尺寸的問題
這個問題首先得從堆棧說起,一個程序一般分為三段:代碼段,數據段(靜態數據),和堆棧段。堆棧段存儲程序中的變數、程序傳遞的參數等(動態分配的變數存儲在堆中,靜態分配的存儲在棧中)。堆棧的增長方式如下:
程序在運行的時候會預先分配堆棧空間,所以你的問題中不一定修改了不該修改的地方,有可能那裡本來就是空的。
再回到malloc這個函數上來,malloc主要負責分配空間,返回該空間的首地址。那為什麼申請空間為0,卻可以存儲7個字元呢?那是因為C語言的指針中並不檢查數組的越界問題,不信的話,你可以這樣:char ch[5],然後你去讀寫ch[6](printf或scanf),這樣是不會報錯的。但是我們在使用的時候,千萬別越界使用,因為這樣的程序是非常危險的,試想,如果越界使用的地址正好是一個操作系統的地址,那麼你一修改,系統就崩了。同時,C語言的這個機制被黑客廣泛地應用與緩沖區溢出攻擊,所以你非但不能越界使用指針,還得時刻考慮到指針(數組)是否越界,以加強程序的安全性。
希望對你有所幫助。。。
⑶ C語言 malloc()函數 分配內存空間尺寸的問題
#include
<stdio.h>
#include
<stdlib.h>
int
main()
{
int
*x
=
0;//定義個指針變數,開始不指向任務地方
x
=
(int
*)malloc(sizeof(int));//用malloc申請內存,並讓指針x指向申請的內存空間
*x
=
100;//給申請的內存空間賦值
printf("%d\n%x\n",*x,x);//列印出申請的空間的值,後面為x指向的內存地址
free(x);//釋放內存,也就到這里
return
0;
}
⑷ 為什麼c語言中malloc函數分配的第一個紀錄可能多花48個位元組
這里需要了解兩個概念:malloc分配的內存放置在堆中,堆中內存會存在內存碎片(或不連續性)
舉個例子現需要分配100位元組內存,而在堆中現在只有60、50、80、70幾個塊了(只是舉例實際內存中不可能是這些值),那要達到100個位元組就至少需要兩個塊,所以大多數實現所分配的存儲空間比所要求的要稍大一些,額外的空間用來記錄管理信息——分配塊的長度,指向下一個分配塊的指針等等。
malloc()申請的空間實際就是分了兩個不同性質的空間。一個就是用來記錄管理信息的空間,另外一個就是可用空間了。
如果想更深入了解建議了解下內存機制還有把malloc函數的源代碼下來看下就一目瞭然了。
⑸ C語言關於堆塊用malloc申請空間的問題
你對操作過程可能有所誤會。有括弧和沒有括弧的表達式是完全等價的,不會存在有括弧的行而沒有括弧的就不行的問題。你的這兩句代碼倒確實是有錯誤的,那就是應該在malloc前加一個強制轉換符(double
*)。因為malloc產生的是void
*型指針,要賦給double型的指針的話要強制轉換一下,不然是要報錯的。
就是說要寫成souble
*array=(double
*)malloc(300*300*sizeof(double));才行。
⑹ C語言我malloc後輸入一定數量的字元串結果出錯為什麼
有關realloc的內容自行網路。
realloc使用錯誤,這里你改成p = realloc(p,i+1);即可。
你可以存入一部分,多了會錯誤的原因是C語言的典型指針問題。實際上用realloc中你總共只申請了1位元組的空間(一直都是1位元組),當輸入123存入了3個位元組,你本身申請的空間不夠於是將你申請的空間地址之前的2個位元組覆蓋了。當覆蓋到一定程度,超出了一定限度,機器(計算機)本身會進行檢測,發現錯誤覆蓋空間,於是產生錯誤信號,提示產生段錯誤。程序停止。
⑺ C語言,怎麼用malloc申請一個100000個變數的字元串數組
可以通過以下語句實現:
char *p; //定義指針變數
p = (char *)malloc(100000);//申請空間並賦值給p。
解析:
malloc為內存分配函數,其定義為
void * malloc(size_t size);
功能為申請size大小的內存長度,並返回分配到的地址值。
而字元類型,每個元素佔1個位元組空間,所以100000個變數的總空間就是100000位元組,於是參數size為100000。