c语言动态数组扩充空间,主要是利用动态存储分配库函数来实现的,常用的有malloc函数和calloc函数。
malloc()是C语言中动态存储管理的一组标准库函数之一。其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。
例如:
char *x
x = (char *)malloc(10)//x就指向了包含10个字符单元的存储空间。
扩展资料:
函数定义
其函数原型为void *malloc(unsigned int size);其作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的返回值是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。
如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。
参考资料来源:百度百科-malloc函数
不会自动扩容,你这个赋值其实已经越界了,但是编译器不会检查是否越界,所以可以编译,不报错。需要注意:越界之后,可能会出现不可预料的问题,也就是很多书上说的,行为未定义,所以应该特别注意这种情况
你的动态数组只有n个元素,已经装满了的话,就需要扩容。
具体看例子。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct User
{
char name[10]
int score
}
int main()
{
const char user_name[]="wonder"
const int user_score=99
//c表示容量,n表示元素数量,incr表示每次扩容时的增量
int c=1,n=0,incr=10
int i
struct User *array=(struct User*)calloc(c,sizeof(struct User))
strcpy(array[0].name,"name1")
array[0].score=1
n++
printf("追加用户前:\n")
for(i=0i<ni++)
printf(n-1!=i ? "%s %d," : "%s %d\n",
array[i].name,array[i].score)
//n>=c说明动态数组array已装满,需扩容
if(n>=c)
{
printf("对动态数组array进行扩容\n")
c+=incr
array=(struct User*)realloc(array,sizeof(struct User)*c)
}
//追加
strcpy(array[n].name,user_name)
array[n].score=user_score
n++
printf("追加用户后:\n")
for(i=0i<ni++)
printf(n-1!=i ? "%s %d," : "%s %d\n",
array[i].name,array[i].score)
free(array)
return 0
}