C语言通过动态申请内存空间来实现动态数组 需要用到calloc
方法或malloc
方法
calloc方法
- 被包含在
stdlib.h
头文件中 - 分配和初始化数组
void * calloc(size_t num,size_t size);
- 分配一块内存给有
nun
个元素的数组,它们中的元素每个为size
大小,并且其所有位初始化为零。 - 有效的结果是分配零初始化的
(num*size)
字节的内存块。 - 如果大小为零,则返回值取决于特定的库实现(它可能是也可能不是空指针),但返回的指针不应被解除引用。
参数
num
- 要分配的元素个数
size
- 每个元素的大小
size_t
是一个无符号整型
返回值
- 成功时,指向由该功能分配的内存块的指针。
- 该指针的类型总是void*可以转换为所需类型的数据指针,以便被解引用。
- 如果函数未能分配请求的内存块,则返回空指针。
动态数组的实现
//动态数组的实现
#include <stdio.h>
#include <stdlib.h>
int main(){
int n,i;
scanf("%d",&n); //输入数组的大小
int *p = (int*)calloc(n,sizeof(int));//申请了一个长度为n的数组,用p指向
for(i = 0;i < n;i++)
scanf("%d",p+i); //输入数组
for(i = 0;i < n;i++)
printf("%d ",*(p+i)); //打印数组
free(p); //申请释放空间
p = NULL;
return 0;
}
malloc 方法
- 被包含在
stdlib.h
头文件中 - 分配内存块
void * malloc(size_t size);
- 分配
size
大小的内存块,将指针返回到块的开头 - 新分配的内存块的内容不被初始化,剩下不确定的值。
- 如果大小为零,则返回值取决于特定的库实现(它可能是也可能不是空指针),但返回的指针不应被解除引用。
参数
size
- 内存块的大小,以字节为单位
size_t
是一个无符号整型
返回值
- 成功时,指向由该功能分配的内存块的指针。
- 该指针的类型总是void*可以转换为所需类型的数据指针,以便被解引用。
- 如果函数未能分配请求的内存块,则返回空指针。
malloc实现
//一个随机的字符串生成代码
#include <stdio.h> /* 包含 printf scanf NULL */
#include <stdlib.h> /* 包含 malloc free rand exit */
int main(){
int i,n;
char * buffer;
printf("你想要多长的字符串\n");
scanf("%d",&i);
buffer = (char*) malloc(i-1);
if(buffer == NULL) exit(1); //程序非正常退出
for(n = 0;n < i;n++)
buffer[n] = rand()%26 + 'a'; //产生随机字符
buffer[i] = '\0';
printf("随机字符串为:%s\n",buffer);
free(buffer); //释放buffer指向的内存
buffer = NULL; //防止出现再次释放的错误将其设为空
return 0;
}