C 如何得到指標分配的記憶體空間塊的大小

時間 2022-09-03 23:43:21

1樓:匿名使用者

實際上在c++的string中,這個length依然是strlen()求出來的值,

目前來看,要解決你說的問題,貌似只能用結構體來存了,struct mystr

; mystr str;

str.length=20;

str.arrray==(char *)malloc(sizeof(char)*str.length);

期待高手給出更好的方法。

2樓:

用sizeof函式是求不出來分配塊的大小的,strlen更不行了。只有在分配的時候把大小存住。不過分配的時候一般都用巨集來定義大小的。

所以需要的時候用巨集還是比較不錯的。再者就是用上面樓說的用結構體存一下吧。

3樓:

你說得對, 動態分配的空間只能自己用乙個變數來儲存。動態分配後只有作業系統才知道它有多大。 strlen只計算從當前位址開始到遇到'\0'的長度,所以沒有初始化的空間是不能用strlen的。

4樓:蒼蠅**

這樣就好了

5樓:匿名使用者

參考一下這個:

c語言怎樣求指標指向的記憶體塊的大小? 5

6樓:匿名使用者

malloc分配的記憶體大小,當然c執行庫是有儲存這個值的,但你並不能使用它,也不能用正常的方式得到它。它的存在只為了free的時候能夠正常的釋放。

所以建議只有,**是你寫的,malloc了多少你自己必然是知道的,沒有必要去查這個資訊。

7樓:當年的反應慢

如果是char *p 可以用strlen(p)來量,其他的型別計算長度,就沒什麼太大意義了吧

8樓:__烟花已冷

p = (char)malloc(4);

4*sizeof(*p);試試

9樓:匿名使用者

不是太明白你得問題。

一般用malloc分配位址的時候需要設定分配的大小,你這裡就是4個char型的資料,而char型是1個位元組的,所以就是4了。這個大小返回的是位元組數。

補充一下,這個大小預設是以位元組為單位,如果你的型別是浮點的,應該是這樣:

float *p;

p= (float*)malloc(4*sizeof(float));

這樣分配的才是4個浮點資料記憶體。

這個指標的記憶體塊大小就是4*sizeof(float)

怎麼檢視動態分配記憶體空間的大小(c語言)。

10樓:匿名使用者

1、這個空間是自己分配的,既然已經寫了p=(int *)malloc(10000)那就分配10000的大小,還需要顯示多少大小。對於乙個指向一塊記憶體的指標如果用比如sizeof(p)顯示大小(int * p=new int[10]),也只是顯示4,代表首位址大小,不能顯示正塊記憶體的大小,而且根本沒有意義。

2、動態記憶體分配,可以自由的分配指定大小的記憶體空間。當程式執行時,程式設計師並不清楚某一資料需要的具體記憶體空間大小時,可以使用動態分配。

malloc函式原型

void *malloc(int nsize)

分配乙個nsize大小的記憶體空間,如果分配成功則返回位址空間的首位址,如果分配失敗則返貨null

nsize一般使用 sizeof(型別a)*n 的計算方式獲取大小。意思為:為分配n個型別a所佔空間的大小。

獲取的指標位址需要強制轉換為指定型別

例如:int *p = (int*)malloc(sizeof(int)*100);

使用malloc動態分配的記憶體空間需要使用free函式手動釋放。

11樓:梁丘鴻遠冒睿

在c語言中,要在堆上分配空間,需要使用記憶體申請函式。一般用malloc。

void

*malloc(int

size);

可以申請一段長度為size位元組的空間,並返回空間的首位址。

要清空分配的記憶體空間,也就是將該空間所有位元組均賦值為0,可以使用memset函式。

該函式宣告與string.h中,形式為

void

memset(void

*start,

intvalue,

intsize);

如果要清空空間的首位址為p,大小為len,則可以呼叫memset(p,

0,len);

12樓:匿名使用者

自己malloc出來當然知道位元組大小,如果把指標傳給乙個函式呢,函式如果不知道其空間大小,對其操作時是有很大溢位風險的,但我又不想增加乙個傳入引數,sizeof()的確算不出指標指向的空間大小,那只能將指標交給與他人使用的時候,把空間大小也告訴對方。所以有時候沒辦法要妥協一下

只通過指標貌似無法知道指標指向的空間大小,那麼free函式又是怎麼知道呢。malloc在分配空間的時候會多分配一些空間來存放分配資訊。(據說在每個記憶體塊的最前的4個位元組就存放了malloc的位元組大小資訊,可以自己寫乙個函式把這些資料提出來,我目前還沒有試驗過)

c語言中怎麼得到乙個指標所指的空間的大小,如:char *p=(char *)malloc(10*sizeof(char));

13樓:金色潛鳥

char *p=(char *)malloc(10*sizeof(char)); 我們知道 是 10。但我們沒有簡單方法能獲得「10」。

通過 calloc, malloc, realloc 分配的空間 (實際消耗的heap空間) 用 函式

size_t _msize( void *memblock ); 可以獲得。

獲得的位元組數,可能大於10。估計原因同 分配結構空間類似,考慮對齊或考慮什麼,要多用去一點空間。

#include

#include

main()

我的編譯器編譯運算結果,輸出 是 16。

14樓:情義

"通過 calloc, malloc, realloc 分配的空間 (實際消耗的heap空間) 用 函式

size_t _msize( void *memblock ); 可以獲得。

具體如下:

#include

#include

main()

編譯器編譯運算結果,輸出 是 16。"

15樓:匿名使用者

得不到的,定義常量吧

16樓:匿名使用者

只能10*sizeof(char)

c語言如何確定乙個指標是否已分配過的記憶體

17樓:匿名使用者

如果malloc()分配失敗,就會返回null,如果成功,那麼返回的就是這段空間的首位址,而不會是null,可以據此判斷malloc()分配是否成功。

18樓:匿名使用者

判斷是否已分配記憶體可以測試指標是否為空,不為空則為已分配,具體可以使用sizeof函式。

1、假設使用c語言的動態分配記憶體函式malloc為指標p分配1000個int型的空間

int* p;

p = (int *) malloc (1000*sizeof(int)); //分配記憶體

if (!p)

printf("記憶體已分配");

19樓:

沒得辦法,只能靠自己注意了,使用null來判斷,自己養成良好的習慣以後這應該不是什麼問題。

初始化的時候要, char *s = null;

記憶體釋放完以後也要, free(s); s = null;

c語言 關於為指標的指標分配記憶體的問題

20樓:匿名使用者

首先:int** 是乙個二級指標,它是指標的指標,如果你要申請乙個二維陣列,有下面兩個方法:

int** val = (int**)malloc(sizeof(int*) * 10);

int i;

for(i = 0; i < 10)

val[i] = (int*)malloc(sizeof(int) * 10);

然後你可以這樣引用:*(*(val+m)+n) = value;

第二種:int* val = (int*)malloc(sizeof(int) * 10 * 10);

然後這樣引用:*(m*10 + n) = value;

這其實就是個一維陣列,不過你把它看成二維的處理。。

希望對你有幫助哦

21樓:匿名使用者

//給你一段**看看,呵呵。

int i=0,j=0,x=10,y=10;

int **array=null;

//注意,是這樣申請空間的,一次性完成

array=(int**)malloc(sizeof(int)*x*y + y*sizeof(int*));

array[0]=(int*)((char*)array + y*sizeof(int*));

for(i=1;i

for( i = 0 ; i < y; i++ )}for( i = 0 ; i < y; i++ )}free(array);//注意,是這樣釋放空間的,一次性完成

22樓:

array 是 int * * 型的嗎?我在vc6.0測試,分配記憶體是正確的,但要明白,分配的記憶體都被認為是int*型的,也就是101個int*型的空間。

*(array+j)得到這101個空間中的某個,是int*型,*(*(array+j)+n)是這101個指標中的某乙個指向的記憶體空間,而這個記憶體空間沒有分配,所以程式執行時會出錯。至於在16位機器上通過,只是僥倖而已,因為16位機器沒有記憶體保護,所有的空間都能訪問,如果訪問了作業系統的空間,可能不會立即崩潰,但系統有可能出問題的。而32位機器有保護模式,訪問非法空間系統會報錯。

23樓:匿名使用者

使用sizeof,就和機器位數無關~

二級指標動態分配方式如下:

int **a;

a=(int**)malloc(m*sizeof(int*));

for(i=0;i

a[i]=(int*)malloc(n*sizeof(int));

c/c++怎樣檢測指標是否已經分配空間

24樓:匿名使用者

int * p;

宣告了乙個指標變數 p,

就為它分配了記憶體了,它佔2位元組大小的記憶體。

如果你說 p = new int[2];才算是分配記憶體,那我告訴你,這句話的意思:

通過new 向系統申請sizeof(int) * 2的記憶體大小,接下來把這塊記憶體的位址返回,

並儲存在p中。

並不是說p有2個int大小的記憶體呢。~~~int * p和int p

一樣,宣告的時候就分配了記憶體。

if ( p )是判斷p是否儲存了一塊記憶體位址,如果不儲存,即為null,否則為記憶體的位址啦。~~~

25樓:匿名使用者

判斷是否為空

如:int *p;

p = ( int * )malloc( sizeof(int) * 5 );

if( null == p )

5代表需要申請5個int型的空間

26樓:匿名使用者

宣告指標時讓它等於null or 0

然後在分配完後檢測它是否還是null or 0

c語言指標記憶體分配問題?跪求大俠解決

1 p的成員還沒有賦初值,2 printf d n p.data 有語法錯誤改為 printf d n p.data 3 next 指標還沒有初始化,也就是說沒有指向某個可以使用的空間 2293576 2147340288 以上為執行結果.表示都是垃圾內容.你創造了乙個linklist型別的變數,也...

char指標變數分配空間,char陣列與char指標的記憶體分配空間

1,char指標不一定必須分配空間才能賦值,比如char ch a char p p ch 或者char str null str malloc 4 if str null 2,memset不是用來分配空間的,而是分配空間之後用來初始化空間的。比如char p malloc sizeof int m...

C指向結構體的陣列指標動態分配記憶體後如何刪除

include using namespace std struct node int main 可以看看這個裡面的,單鏈表就是你描述的那種用法 上面那個是乙個簡單的建立單節點的 free arry 修改如下 include include include include include inclu...

請c語言高手動態分配指標問題

你第二次malloc返回的值將p原來的值覆蓋掉了,也就是原來的資料無法引用了,現在p只指向乙個float,你卻用p i引用,肯定是不可以的。動態分配記憶體不是你這樣用的,好好看看書把概念搞清楚。你第一次分配的記憶體還沒有釋放,第二次又分配指向同乙個指標,那前面的記憶體都浪費了。還有你第二次僅分配了1...

C 類裡面的指標如何清除,C 類裡面的指標如何清除

在析構函式裡清除 a 指標 pointer 是程式語言中的乙個物件,利用位址,它的值直接指向 points to 存在電腦儲存器中另乙個地方的值。由於通過位址能找到所需的變數單元,可以說,位址指向該變數單元。因此,將位址形象化的稱為 指標 意思是通過它能找到以它為位址的記憶體單元。在高階語言中,指標...