C语言分配内存函数

C语言分配内存是C语言编程中的一个重要概念,它涉及到如何在程序运行时为变量、数组等数据结构分配内存空间,在C语言中,内存分配是通过使用动态内存分配函数来实现的,这些函数包括malloc、calloc、realloc和free,本文将详细介绍这些内存分配函数的用法和注意事项。

1、malloc函数

malloc函数用于在堆区分配指定字节数的内存空间,它的原型如下:

void *malloc(size_t size);

size参数表示要分配的字节数,malloc函数返回一个指向分配内存起始地址的指针,如果分配失败,则返回NULL。

示例代码:

#include <stdio.h>
#include <stdlib.h>
int main() {
    int *arr;
    int n = 5;
    // 使用malloc分配内存空间
    arr = (int *)malloc(n * sizeof(int));
    if (arr == NULL) {
        printf("内存分配失败!
");
        return 1;
    }
    // 使用分配的内存空间
    for (int i = 0; i < n; i++) {
        arr[i] = i + 1;
    }
    // 打印数组元素
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("
");
    // 释放内存空间
    free(arr);
    return 0;
}

2、calloc函数

calloc函数用于在堆区分配指定字节数的内存空间,并将分配的内存空间初始化为0,它的原型如下:

void *calloc(size_t nmemb, size_t size);

C语言分配内存函数

nmemb参数表示要分配的元素个数,size参数表示每个元素的字节数,calloc函数返回一个指向分配内存起始地址的指针,如果分配失败,则返回NULL。

示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    char *str;
    int n = 5;
    // 使用calloc分配内存空间并初始化为0
    str = (char *)calloc(n, sizeof(char));
    if (str == NULL) {
        printf("内存分配失败!
");
        return 1;
    }
    // 使用分配的内存空间并修改字符串内容
    strncpy(str, "Hello", n - 1);
    str[n - 1] = '\0'; // 确保字符串以'\0'结尾
    printf("%s
", str); // 输出"Hello"(注意:最后一个字符是'\0')
    // 释放内存空间(不需要手动释放,因为calloc会自动处理)
    return 0;
}

3、realloc函数

C语言分配内存函数

realloc函数用于重新分配内存空间,它可以调整已分配内存的大小,它的原型如下:

void *realloc(void *ptr, size_t size);

ptr参数表示要重新分配的内存起始地址,size参数表示新的字节数,realloc函数返回一个指向新内存起始地址的指针,如果分配失败,则返回NULL,如果成功,原来的内存空间将被释放,需要注意的是,当调整内存大小时,新内存的内容可能会被破坏,因此在调用realloc之后,需要检查返回值是否为NULL,以及是否需要重新赋值。

示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h> // 用于检查断言是否成立(可选)
int main() {
    int *arr;
    int n = 5; // 初始数组大小为5个整数(40字节)
    int m = 10; // 调整后的数组大小为10个整数(80字节)
    int temp[m]; // 临时数组用于存储原数组元素(可选)
    int i; // 循环计数器(可选)
    int j; // 循环计数器(可选)
    int k = 0; // 新数组下标(可选)
    int found = 0; // 查找原数组元素是否在新数组中的标记(可选)
    assert(n <= m); // 确保n不大于m(可选)
    assert(m % sizeof(int) == 0); // 确保m是整数倍(可选)
    assert(temp != NULL); // 确保临时数组不为空(可选)
    assert(k >= 0 && k <= m - n); // 确保k在有效范围内(可选)
    assert(found >= 0 && found <= n - 1); // 确保found在有效范围内(可选)																																																		// 使用realloc调整内存大小并复制元素到新数组中(可选)



// 检查realloc是否成功(可选)



if (realloc(arr, m * sizeof(int)) == NULL) {


printf("内存重新分配失败!
");
return 1;
}

// 使用新数组(可选)

for (i = 0; i < m; i++) {
if (!found) {
temp[k++] = arr[i];
} else {
temp[k++] = arr[i];
found--;
}
}
// 释放原数组内存(可选)
free(arr);
// 将临时数组赋值给原数组(可选)
arr = temp;
// 打印新数组元素(可选)
for (i = 0; i < m; i++) {
printf("%d ", arr[i]);
}
printf("
");
return 0;
}
```
内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构》的官方网站或公开发表的信息,内容仅供参考使用!本站为非盈利性质站点,本着免费分享原则,发布内容不收取任何费用也不接任何广告! 【若侵害到您的利益,请联系我们删除处理。投诉邮箱:i77i88@88.com】

本文链接:http://7707.net/c/202401112389.html

发表评论

提交评论

评论列表

还没有评论,快来说点什么吧~