malloc()函数和数组

我们需要访问malloc函数所存入的数据,一般可以使用地址偏移的方式比如uint64_t *chunk = (uint64_t *)malloc(65536);如果要访问第一个数据就是*(chunk)  如果访问第二个数据就是*(chunk +1)  千万别写成(*chunk+8)。但是这种方式对于循环遍历不方便。

为了简化访问方法,C语言使用了一种简单的对指针运算——[ ]下标运算。

[ ]运算符是C语言几乎最高优先级的运算符。[ ]运算符需要两个操作数,一个指针类型,一个整数。/*补充[1]*/
标准的写法是这样的:a[int]。这样编译器会返回 *(a+int) 的值。
这样做的话相当于一个十分好用的临时指针的移动。
如果我要访问第12个变量只需要写a[11]就好了。编译器会理解这个运算的规则,自动的把a指针进行一次以下的操作:
int *temp;temp=a+11;return *temp;
嗯,大概就是这个样子。

#include<stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main(){
uint64_t *chunk = (uint64_t *)malloc(65536);
printf("chunk%u\n",chunk[8191]);
free(chunk);

}

上面的程序65536/8=8192。打印数据大小,最大是chunk[8191],因为uint64_t占8个字节大小。

int main()
{
  int a[5];
  printf("%p\n",a);

}

在int  型数组a[5]中,a代表数组中a[0]的首地址,在a[5]这个数组中一共占用了5乘以4 =20个字节的空间大小。这也就是为什么上面分配了65536个字节,输出末尾数据是chunk[8191]了。因为uint64_t 占用8个字节的大小。

数组分配地址和malloc函数的区别。

malloc函数与new关键词的作用差不多,都是在程序运行时向操作系统申请并分配一块连续的内存空间(内存块),所在位置是在堆内存上,程序运行时向操作系统申请分配内存,内存地址由操作系统决定,叫做动态分配;编译时分配或安排内存空间叫静态分配,静态分配的内存空间一般在栈上,相对于程序进程空间,由编译器决定,这是两个主要区别。动态内存分配不像数组静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。

通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间。这种内存分配称为静态存储分配;有些操作对象只在程序运行时才能确定,这样编译时就无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分配。所有动态存储分配都在堆区中进行。

当程序运行到需要一个动态分配的变量或对象时,必须向系统申请取得堆中的一块所需大小的存贮空间,用于存贮该变量或对象。当不再使用该变量或对象时,也就是它的生命结束时,要显式释放它所占用的存贮空间,这样系统就能对该堆空间进行再次分配,做到重复使用有限的资源。

malloc是动态分配内存,是在堆空间上。如果你是知道数组大小的情况下就用数组,数组在栈空间。默认最大大小为1MB的空间。速度快效率高!不会产生内存碎片。malloc一般就是用在你不知道到底有多大的情况或者需要动态分配的情况!一般为了效率,比如读文件,我不知道文件大小的情况下,我先预留一个估计大于文件大小的数组用于接收,而不是动态分配!

malloc动态分配与数组静态分配还有一个最重要的区别:

1.假设数组char a[10]和char*p=(char*)malloc(10)都是全局的。那么数组a[10]在程序运行过程会一直存在,即一直占用10个字节空间。但动态申请的可以使用free()来释放掉.等到再使用的时候重新申请.

2.局部的数组在超过其作用域范围内会释放掉,但动态申请出来的空间不会.如.

char *fun()
{
    char p[10];//局部的数组
    return p;//返回一个临时的局部变量,这个函数一结束,p的空间就会释放掉,所以是没有返回成功的.
}但

char *fun()
{
    char *p=(char*)malloc(10);//动态申请空间
    return p;//返回动态申请的空间是可以的.
}

void main()

{

     char *s=fun();

    strcpy(s,"abc");//如果fun()里是动态申请的,可以拷贝成功,否则不成功,是乱码.

}

 

 

  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值