㈠ 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;
}