内存管理方法

1.malloc

动态内存分配,用于申请一块指定大小的内存空间,其返回值为 void*类型,即返回这片内存空间的首地址,在将其赋值给指针时需要进行强制类型转换,其参数是该空间的字节数。

#include <stdio.h>
#include <stdlib.h>
int main() {
    int *p = (int *)malloc(sizeof(int) * 10);
    for (int i = 0; i < 10; i++){
        p[i] = rand() % 100;
    }
    for(int i = 0; i < 10; i++){
        printf("p[%d] = %d\n", i, p[i]);
    }
    return 0;
}

输出结果是:

p[0] = 41
p[1] = 67
p[2] = 34
p[3] = 0
p[4] = 69
p[5] = 24
p[6] = 78
p[7] = 58
p[8] = 62
p[9] = 64

2.calloc

和malloc一样,calloc也是用于申请内存空间的,不同的地方是,calloc保证申请的空间初始化为0,以及calloc的参数列表是包含两项,第一项是申请开辟的元素的数目,第二项是元素的大小。

#include <stdio.h>
#include <stdlib.h>
int main() {
    int *p = (int *)malloc(sizeof(int) * 10);
    for(int i = 0; i < 10; i++){
        printf("p[%d] = %d\n", i, p[i]);
    }
    int *p2 = (int *)calloc(10, sizeof(int));
    for(int i = 0; i < 10; i++){
        printf("p2[%d] = %d\n", i, p2[i]);
    }
    return 0;
}

输出结果是:

p[0] = -1163005939
p[1] = -1163005939
p[2] = -1163005939
p[3] = -1163005939
p[4] = -1163005939
p[5] = -1163005939
p[6] = -1163005939
p[7] = -1163005939
p[8] = -1163005939
p[9] = -1163005939
p2[0] = 0
p2[1] = 0
p2[2] = 0
p2[3] = 0
p2[4] = 0
p2[5] = 0
p2[6] = 0
p2[7] = 0
p2[8] = 0
p2[9] = 0

可以明显看出通过calloc申请的内存空间的值被初始化为0。

3.free

释放因malloc等函数为指针变量开辟的内存空间,其参数为该指针变量。

void free(void *p);

4.memset

内存设置,将一段内存中的每个字节替换为给定值,其参数有三项,第一项为为指针,存放这段内存空间的首地址,第二项为想要替换的指定值,第三项为替换的内存的字节数。

这里注意memset的值的替换是对于字节而言的,比如,当指定值为0时,对于一个整型的四个字节他每位都为0,则每个整型都被赋值为0,当指定值为-1时,由二进制补码的性质可知,对于一个整型的四个字节他每一位都是1,转换为十进制就是-1,但是,当指定值为2时,其每个字节存2,得出的整型值一定不为2,所以一般的我们用memset就赋值为0或-1。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    int *p = (int *)malloc(sizeof(int) * 10);
    for(int i = 0; i < 10; i++){
        p[i] = rand() % 100;
    }
    for(int i = 0; i < 10; i++){
        printf("p[%d] = %d\n", i, p[i]);
    }
    memset(p, -1, sizeof(int) * 10);
    for(int i = 0; i < 10; i++){
        printf("p[%d] = %d\n", i, p[i]);
    }
    return 0;
}

当赋值为2时的结果:

p[0] = 33686018
p[1] = 33686018
p[2] = 33686018
p[3] = 33686018
p[4] = 33686018
p[5] = 33686018
p[6] = 33686018
p[7] = 33686018
p[8] = 33686018
p[9] = 33686018

5.memcpy

内存数据拷贝,包含三个参数,第一项是和第二项都是一个指针,分别存放拷贝到的区域的首地址和被拷贝的内存的首地址,第三项是拷贝的字节数。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    char str1[100] = "hello world";
    char str2[100];
    memcpy(str2, str1, 12);
    printf("%s", str2);
    return 0;
}
hello world

注意拷贝字符串的时候,不要忘记‘\0’。

6.memmove

和memcpy一样,但可以处理内存空间重叠的情况。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    char str1[100] = "hello world";
    char str3[100];
    memmove(str3, str1, 12);
    printf("str3 = %s\n", str3);

    memmove(str3 + 4, str3, 12);
    printf("str3 = %s\n", str3);
    return 0;
}

结果:

str3 = hello world
str3 = hellhello world

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值