什么是静态数组
先看这段代码
int main(){
int a[n];
n=2;
}
这段代码是错误的,因为运行到a[n]时,编译器不知道需要为这个数组分配多大的空间。也就是我们不可以定义一个大小未知的数组
我们把这段代码修改一下
下面的这段代码就是正确的了
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int a[n];
}
那么这个是动态数组吗
我们可以根据需要设置数组a[n]的大小,但是之后不可以改变数组的大小
这个并不是动态数组,但是这种方法已经很方便了
什么是动态数组
动态数组是在运行时通过动态内存分配函数(如malloc 和 calloc)手动分配内存的数组。这意味着你可以在程序运行时根据实际需要来决定数组的大小,而不是在编译时就确定下来
现在我们需要解决这个问题,怎样定义一个结构体变量,它的一个成员是数组,并且数组的大小可以改变
结构体变量里的成员名如果与程序中其它变量名相同,它们不会相互影响,所以下面这段代码是错误的
#include<stdio.h>
#include<stdlib.h>
int main(){
int n;
scanf("%d",&n);
struct Data{
int i;
int a[n];}
struct Data data1;
}
因为数组a[n]的大小是未知的
要解决这个问题,我们就需要用到动态数组
#include<stdio.h>
#include<stdlib.h>
int main(){
struct Data{
int i;
int*p;
}
struct Data data1;
int n,t;
scanf("%d",&n);
data1.p=(int*)malloc(n*sizeof(int));
for(t=0;t<n;t++)
{scanf("%d"),data1.p+t}
}
这样问题就可以解决了
malloc和realloc函数怎么用
malloc()
和realloc()
函数在C语言中都用于动态内存分配。它们分配的都是连续的内存空间
如果已经通过malloc函数获得了空间,可以用realloc函数重新分配
这两个函数的返回值都是指针,下面我们讨论一下realloc是怎样工作的
如果在原来的空间里已经储存了数据,对这段空间的指针使用realloc来扩大它的空间后,原来空间里的数据会受到影响吗
如果在原来的空间里已经储存了数据,对这段空间的指针使用realloc来扩大它的空间后,原来空间里的数据不会受到影响。realloc函数会尝试在原来的内存位置后面找到更多的空闲空间来扩展内存块的大小。如果成功,它会返回一个新的指针,指向新的内存块;如果失败,则返回NULL。在这个过程中,原来内存块中的数据不会被改变或删除。
需要注意的是,realloc可能会将原来的内存块移动到另一个位置,因此返回的指针可能与原始指针不同。在使用realloc之后,应该使用返回的新指针来访问和操作内存块,而不是原始指针。