㈠ c語言中為struct分配內存空間是否一定是連續空間
當然是連續的空間,可以用memory
。不僅一個struct,就是多個struct的數組也是連續的空間。
㈡ 求助:用C語言指針編寫一個函數alloc(n) 在內存區開辟和釋放一個連續空間
char _gacMemBlk[1000];
char * _gpcMemBlkBgn = _gacMemBlk;
int _giPos = 0;
void * alloc(int n)
{
if (1000 - _giPos < n)
return NULL;
char * p = _gpcMemBlkBgn + _giPos;
_giPos += n;
return (void *)p;
}
void free(void * p)
{
}
// 註:alloc, free不像你描述的那麼簡單,其實每次分配還要用一個連表記錄下來其位置和大小,而每次分配不一定要從末尾開始分,而是在連表中找一塊空白的,分一砣,剩下的又是一塊插到連表中,而釋放的時候,如果前後更好挨著,則需要合並
㈢ C語言:編寫一個函數new 對n個字元開辟連續的存儲空間
在純粹C編譯器下,用new作函數名是可以的,但在與C++兼容的編譯器下,是不可能通過編譯的,因為new是C++的申請內存操作符,屬保留字,不能由用戶用作標識符。這里將new改為mynew,舉例代碼如下:
//#include"stdafx.h"//Ifthevc++6.0,withthisline.
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
char*mynew(intn){
char*p;
if(p=(char*)malloc(n))
returnp;
elsereturnNULL;
}
intmain(void){
char*p=mynew(20);//申請20個連續位元組空間
if(p){//若申請成功
strcpy(p,"1234567890");//向申請的空間寫入字元串
printf("%s ",p);//打出來看看
free(p);//釋放申請的空間
}
elseprintf("Applicationmemoryfailure... ");
return0;
}
㈣ c語言動態數組如何擴充空間
c語言動態數組擴充空間,主要是利用動態存儲分配庫函數來實現的,常用的有malloc函數和calloc函數。
malloc()是C語言中動態存儲管理的一組標准庫函數之一。其作用是在內存的動態存儲區中分配一個長度為size的連續空間。其參數是一個無符號整形數,返回值是一個指向所分配的連續存儲域的起始地址的指針。
例如:
char *x;
x = (char *)malloc(10); //x就指向了包含10個字元單元的存儲空間。
(4)c語言寫連續空間擴展閱讀:
函數定義
其函數原型為void *malloc(unsigned int size);其作用是在內存的動態存儲區中分配一個長度為size的連續空間。此函數的返回值是分配區域的起始地址,或者說,此函數是一個指針型函數,返回的指針指向該分配域的開頭位置。
如果分配成功則返回指向被分配內存的指針(此存儲區中的初始值不確定),否則返回空指針NULL。當內存不再使用時,應使用free()函數將內存塊釋放。函數返回的指針一定要適當對齊,使其可以用於任何數據對象。
㈤ c語言中為struct分配內存空間是否一定是連續空間
有人給對齊原則做過總結,具體在哪裡看到現在已記不起來,這里引用一下前人的經驗(在沒有#pragma pack宏的情況下):
原則1、數據成員對齊規則:結構(struct或聯合union)的數據成員,第一個數據成員放在offset為0的地方,以後每個數據成員存儲的起始位置要從該成員大小的整數倍開始(比如int在32位機為4位元組,則要從4的整數倍地址開始存儲)。
原則2、結構體作為成員:如果一個結構里有某些結構體成員,則結構體成員要從其內部最大元素大小的整數倍地址開始存儲。(struct a里存有struct b,b里有char,int,double等元素,那b應該從8的整數倍開始存儲。)
原則3、收尾工作:結構體的總大小,也就是sizeof的結果,必須是其內部最大成員的整數倍,不足的要補齊。
這三個原則具體怎樣理解呢?我們看下面幾個例子,通過實例來加深理解。
例1:struct {
short a1;
short a2;
short a3;
}A;
struct{
long a1;
short a2;
}B;
sizeof(A) = 6; 這個很好理解,三個short都為2。
sizeof(B) = 8; 這個比是不是比預想的大2個位元組?long為4,short為2,整個為8,因為原則3。
例2:struct A{
int a;
char b;
short c;
};
struct B{
char b;
int a;
short c;
};
sizeof(A) = 8; int為4,char為1,short為2,這里用到了原則1和原則3。
sizeof(B) = 12; 是否超出預想范圍?char為1,int為4,short為2,怎麼會是12?還是原則1和原則3。
深究一下,為什麼是這樣,我們可以看看內存里的布局情況。
a b c
A的內存布局:1111, 1*, 11
b a c
B的內存布局:1***, 1111, 11**
其中星號*表示填充的位元組。A中,b後面為何要補充一個位元組?因為c為short,其起始位置要為2的倍數,就是原則1。c的後面沒有補充,因為b和c正好佔用4個位元組,整個A佔用空間為4的倍數,也就是最大成員int類型的倍數,所以不用補充。
B中,b是char為1,b後面補充了3個位元組,因為a是int為4,根據原則1,起始位置要為4的倍數,所以b後面要補充3個位元組。c後面補充兩個位元組,根據原則3,整個B佔用空間要為4的倍數,c後面不補充,整個B的空間為10,不符,所以要補充2個位元組。
再看一個結構中含有結構成員的例子:
例3:struct A{
int a;
double b;
float c;
};
struct B{
char e[2];
int f;
double g;
short h;
struct A i;
};
sizeof(A) = 24; 這個比較好理解,int為4,double為8,float為4,總長為8的倍數,補齊,所以整個A為24。
sizeof(B) = 48; 看看B的內存布局。
e f g h i
B的內存布局:11* *, 1111, 11111111, 11 * * * * * *, 1111* * * *, 11111111, 1111 * * * *
i其實就是A的內存布局。i的起始位置要為8的倍數,所以h後面要補齊。把B的內存布局弄清楚,有關結構體的對齊方式基本就算掌握了。
㈥ c語言中必須用一組地址連續的空間來存放多個數據類型相同的數據形式是什麼
數組.相對的,鏈表可以不用連續空間存放數據類型相同的數據,但是相同數據情況下,數組可以節約空間,鏈表會浪費點
㈦ C語言 指針編寫一個函數alloc(n) 在內存區開辟和釋放一個連續空間
#include <stdio.h>
#define LEN (1000)
unsigned char base[LEN];
unsigned char *p=(unsigned char *)base;
void *Alloc(unsigned int n)
{
unsigned char *pp=p;
if(p+sizeof(unsigned int)+n<base+LEN&&n>0)
{
*(unsigned int*)p=n;
p+=sizeof(unsigned int)+n;
pp+=sizeof(unsigned int);
}
else
{
pp=NULL;
}
return pp;
}
void Free(unsigned char *ptr)
{
if(!ptr)
return;
p-=sizeof(unsigned int)+*(unsigned int *)(ptr-sizeof(unsigned int));
}
int main()
{
unsigned char *a=NULL;
printf("base=%p,p=%p,a=%p\n",base,p,a);
a=Alloc(10);
printf("base=%p,p=%p,a=%p\n",base,p,a);
Free(a);
printf("base=%p,p=%p,a=%p\n",base,p,a);
return 0;
}