malloccallocrealloc

Posted 小李一米九

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了malloccallocrealloc相关的知识,希望对你有一定的参考价值。

文章目录

malloc

头文件:#include<stdlib.h>

malloc()函数用来动态地分配内存空间,其原型为:

void* malloc(size_t size);//size为需要分配的内存空间的大小,以字节(Byte)计。

函数说明】malloc()在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值时未知的。如果希望在分配内存的同时进行初始化,请使用calloc()函数。

返回值】分配成功返回指向该内存的地址,失败则返回NULL。

由于申请内存空间时可能有也可能没有,所以需要自行判断是否申请成功,再进行操作。

如果size的值为0,那么返回值会因标准库实现的不同而不同,可能是NULL,也可能不是,但返回的指针不应该再次被引用

注 意 : 函 数 的 返 回 值 类 型 是 v o i d ∗ , v o i d 并 不 是 说 没 有 返 回 值 或 者 返 回 空 指 针 , 而 是 返 回 的 指 针 类 型 未 知 。 \\colorred注意:函数的返回值类型是 void *,void 并不是说没有返回值或者返回空指针,而是返回的指针类型未知。 voidvoid
所以在使用 malloc() 时通常需要进行强制类型转换,将 void 指针转换成我们希望的类型,例如:

注意:函数的返回值类型是 void *void 并不是说没有返回值或者返回空指针,而是返回的指针类型未知。

动态内存分配举例:

#include <stdio.h>  /* printf, scanf, NULL */
#include <stdlib.h>  /* malloc, free, rand, system */
int main ()

    int i,n;
    char * buffer;
    printf ("输入字符串的长度:");
    scanf ("%d", &i);
    buffer = (char*)malloc(i+1);  // 字符串最后包含 \\0
    if(buffer==NULL) exit(1);  // 判断是否分配成功
    // 随机生成字符串
    for(n=0; n<i; n++)
        buffer[n] = rand()%26+'a';
    buffer[i]='\\0';
    printf ("随机生成的字符串为:%s\\n",buffer);
    free(buffer);  // 释放内存空间
    system("pause");
    return 0;

运行结果:
输入字符串的长度:20
随机生成的字符串为:phqghumeaylnlfdxfirc

该程序生成一个指定长度的字符串,并用随机生成的字符填充。字符串的长度仅受限于可用内存的长度。

calloc

头文件:#include <stdlib.h>

calloc() 函数用来动态地分配内存空间并初始化为 0,其原型为:

void* calloc (size_t num, size_t size);

calloc() 在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。所以它的结果是分配了 num*size 个字节长度的内存空间,并且每个字节的值都是0。

返回值】分配成功返回指向该内存的地址,失败则返回 NULL。

如果 size 的值为 0,那么返回值会因标准库实现的不同而不同,可能是 NULL,也可能不是,但返回的指针不应该再次被引用。

注意:函数的返回值类型是 void *,void 并不是说没有返回值或者返回空指针,而是返回的指针类型未知。所以在使用 calloc() 时通常需要进行强制类型转换,将 void 指针转换成我们希望的类型,例如:

char *ptr = (char *)calloc(10, 10);  // 分配100个字节的内存空间

calloc() 与 malloc() 的一个重要区别是:calloc() 在动态分配完内存后,自动初始化该内存空间为零,而 malloc() 不初始化,里边数据是未知的垃圾数据。下面的两种写法是等价的:

// calloc() 分配内存空间并初始化
char *str1 = (char *)calloc(10, 2);
// malloc() 分配内存空间并用 memset() 初始化
char *str2 = (char *)malloc(20);
memset(str2, 0, 20);

代码示例:

#include <stdio.h>
#include <stdlib.h>
int main ()

    int i,n;
    int * pData;
    printf ("要输入的数字的数目:");
    scanf ("%d",&i);
    pData = (int*) calloc (i,sizeof(int));
    if (pData==NULL) exit (1);
    for (n=0;n<i;n++)
    
        printf ("请输入数字 #%d:",n+1);
        scanf ("%d",&pData[n]);
    
    printf ("你输入的数字为:");
    for (n=0;n<i;n++) printf ("%d ",pData[n]);
   
    free (pData);
    system("pause");
    return 0;

运行结果:
要输入的数字的数目:4
请输入数字 #1:126
请输入数字 #2:343
请输入数字 #3:45
请输入数字 #4:234
你输入的数字为:126 343 45 234

realloc

头文件:#include <stdlib.h>

realloc() 函数用来重新分配内存空间,其原型为:

void* realloc (void* ptr, size_t size);//ptr 为需要重新分配的内存空间指针,size 为新的内存空间的大小。

realloc() 对 ptr 指向的内存重新分配 size 大小的空间,size 可比原来的大或者小,还可以不变(如果你无聊的话)。当 malloc()、calloc() 分配的内存空间不够用时,就可以用 realloc() 来调整已分配的内存。

如果 ptr 为 NULL,它的效果和 malloc() 相同,即分配 size 字节的内存空间。

如果 size 的值为 0,那么 ptr 指向的内存空间就会被释放,但是由于没有开辟新的内存空间,所以会返回空指针;类似于调用 free()。

几点注意:

  • 指针 ptr 必须是在动态内存空间分配成功的指针,形如如下的指针是不可以的:int *i; inta[2];会导致运行时错误,可以简单的这样记忆:用 malloc()、calloc()、realloc() 分配成功的指针才能被 realloc() 函数接受。
  • 成功分配内存后 ptr 将被系统回收,一定不可再对 ptr 指针做任何操作,包括 free();相反的,可以对 realloc() 函数的返回值进行正常操作。
  • 如果是扩大内存操作会把 ptr指向的内存中的数据复制到新地址(新地址也可能会和原地址相同,但依旧不能对原指针进行任何操作);如果是缩小内存操作,原始据会被复制并截取新长度。

返回值】分配成功返回新的内存地址,可能与 ptr 相同,也可能不同;失败则返回 NULL。

注 意 : 如 果 分 配 失 败 , p t r 指 向 的 内 存 不 会 被 释 放 , 它 的 内 容 也 不 会 改 变 , 依 然 可 以 正 常 使 用 。 \\colorred注意:如果分配失败,ptr 指向的内存不会被释放,它的内容也不会改变,依然可以正常使用。 ptr使

代码示例:

#include <stdio.h>
#include <stdlib.h>
int main ()

    int input,n;
    int count = 0;
    int* numbers = NULL;
    int* more_numbers = NULL;
    do 
        printf ("Enter an integer value (0 to end): ");
        scanf ("%d", &input);
        count++;
        more_numbers = (int*) realloc (numbers, count * sizeof(int));
        if (more_numbers!=NULL) 
            numbers=more_numbers;
            numbers[count-1]=input;
        else 
            free (numbers);
            puts ("Error (re)allocating memory");
            exit (1);
        
     while(input!=0);
    printf ("Numbers entered: ");
    for (n=0;n<count;n++) printf("%d ",numbers[n]);
    free (numbers);
    system("pause");
    return 0;

运行结果:
Enter an integer value (0 to end): 23
Enter an integer value (0 to end): 45
Enter an integer value (0 to end): 23
Enter an integer value (0 to end): 67
Enter an integer value (0 to end): 0
Numbers entered: 23 45 23 67 0

上面的代码提示用户输入若干个数字(输入 0 结束)。每次输入新的数字,numbers 指向的内存空间就会增长 sizeof(int) 的长度。

以上是关于malloccallocrealloc的主要内容,如果未能解决你的问题,请参考以下文章

malloccallocrealloc

malloccallocrealloc

malloccallocrealloc的区别

寻找回文字串数目使用js写法

蛋白质对中可能相互作用域的数目计算

5457. 和为奇数的子数组数目。 前缀和