C语⾔数组初始化及malloc初始化
前⾔
做笔试题的时候⽼有些⼩错误,来总结⼀下。
数组赋值初始化的三个⽅式
1、{0} 初始化
例如:
int nums[3]={0};
但是经常出现的是给定长度(变量)然后需要进⾏初始化,如果写成下式:
int main(){
int numsSize=0;
scanf("%d",&numsSize);
int nums[numsSize]={0};
}
则会出现以下报错信息:
error: variable-sized object may not be initialized?这个提⽰是:变量⼤⼩的对象不能被初始化。
显⽰如下错误信息的原因是可以⽤变量定义数组长度,但不可初始化。
2、for 循环初始化
该⽅式常⽤于获取输⼊时,将for循环中的内容改为**scanf("%d",&nums[i]);**即可实现。
int nums[3];
for(int i =0; i <3; i++){
nums[i]= i;
}
3、memset 函数
memset ⼀般使⽤“0”初始化内存单元,通常是给数组或结构体进⾏初始化,或清空数组或结构体。
因此可以⽤变量定义数组长度,再通过使⽤memset函数使整个数组置0实现初始化。
使⽤时需要使⽤库,#include <string.h>
int main(){
int numsSize=0;
scanf("%d",&numsSize);
int nums[numsSize];
memset(nums,0,sizeof(int)*numsSize);
}
molloc函数
注:需要注意的是:memset函数按字节对内存块进⾏初始化,所以不能⽤它将 int 数组初始化为 0 和 -1 之外的其他值。使⽤malloc动态分配⼤⼩
使⽤时需包含头⽂件:#include <stdlib.h>
1、动态申请⼀维数组
scanf("%d",&numsSize);
int*temp =(int*)malloc(sizeof(int)* numsSize);
2、动态申请⼆维数组
⾸先通过:pArray = (int **)malloc( n * sizeof(int * ) )该语句来分配所有⾏的⾸地址 。接着pArray[i] = (int *)malloc( m *
sizeof(int) );来分配每⾏的⾸地址。
//获取⾏列数
scanf("%d %d",&n,&m );
//动态分配存储数组的⼤⼩
pArray =(int**)malloc( n *sizeof(int*));
//使⽤双层循环将数据读⼊数组中
for( i=0; i<n; i++)
{
pArray[i]=(int*)malloc( m *sizeof(int));
for( j=0; j<m; j++)
{
scanf("%d", pArray[i]+ j );
}
}
3、对动态数组进⾏初始化
希望在分配内存的同时进⾏初始化,请使⽤ calloc() 函数。
calloc() 函数是动态申请内存函数之⼀,相当于⽤malloc函数申请并且初始化⼀样,calloc函数会将申请的内存全部初始化为0。
calloc() 函数⽤来动态地分配内存空间并初始化为 0,其原型为:
void * calloc (size_t num, size_t size);
calloc()函数有两个参数,分别为元素的数⽬和每个元素的⼤⼩,这两个参数的乘积就是要分配的内存空间的⼤⼩。
calloc() 在内存中动态地分配 num 个长度为 size 的连续空间,并将每⼀个字节都初始化为 0。所以它的结果是分配了
num*size 个字节长度的内存空间,并且每个字节的值都是0。
如果 size 的值为 0,那么返回值会因标准库实现的不同⽽不同,可能是 NULL,也可能不是,但返回的指针不应该再次被引⽤。
-int*res =(int*)calloc(numsSize,sizeof(int));
-//⽅法⼆:
-int*res =(int*)malloc(numsSize *sizeof(int));
memset(res,0, numsSize *sizeof(int));
//测试代码
for(int i=0;i<numsSize;i++){
printf("%d\n",res[i]);
}
注:⽤memset给指针变量如p所指向的内存单元进⾏初始化时,n 千万别写成 sizeof( p ),因为 p 是指针变量,不管 p 指向什么类型的变量,sizeof( p ) 的值都是 4。
参考⽂献
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论