学点 C 语言(23): 数据类型 - 给指针分配内存

180it 2020-03-05 AM 1798℃ 0条

学点 C 语言(23): 数据类型 - 给指针分配内存

C 语言的内存分配很简单: malloc、calloc、realloc、free

malloc(字节数); 返回内存段的首地址, void 的.

calloc(个数, 类型大小); 和 malloc 的区别就是它会初始化内存为空.

realloc(原指针, 字节数); 重新分配由 malloc、calloc 分配的内存; 这里有太多注意事项:
1、如果缩小了, 会截掉一块, 会保留前面的内容;
2、如果扩大了, 仍会保留已有的内容, 但新加的内存不会初始化;
3、在扩大时, 有可能内存地址会变化, 这样原来的指针就废了, 不过返回值是新指针, 所以继续使用的应该是返回值.

如果分配失败会返回 NULL, 一般是因为内存不足; 分配 0 字节内存也会返回 NULL 但这没有意义.

它们都是用 free(指针) 释放.

  1. 给一个整数分配内存:

    include <stdio.h>

    include <stdlib.h>

int main(void)
{

int *p = NULL;

// p = malloc(sizeof(int)); / 应该像下一句同时类型转换, 不然在 C++ 里面不行 /

p = (int *)malloc(sizeof(int));

*p = 100;
printf("%d\n", *p);

free(p);

getchar();
return 0;

}

  1. 给 3 个整数分配内存:

    include <stdio.h>

    include <stdlib.h>

int main(void)
{

int *p = NULL;

p = (int *)malloc(sizeof(int)*3);

*p = 111;
*(p+1) = 222;
*(p+2) = 333;

printf("%d,%d,%d\n", *p, *(p+1), *(p+2));

free(p);
getchar();
return 0;

}

  1. 像数组一样使用:

    include <stdio.h>

    include <stdlib.h>

int main(void)
{

int *p = (int *)malloc(sizeof(int)*3);

p[0] = 111;
p[1] = 222;
p[2] = 333;

printf("%d, %d, %d\n", p[0], p[1], p[2]);

free(p);
getchar();
return 0;

}

  1. calloc 会同时初始化内存, malloc 则不会, 不初始化应该更快些:

    include <stdio.h>

    include <stdlib.h>

int main(void)
{

const int num = 10;

// calloc 和 malloc 参数也有点区别
long *p1 = (long *)calloc(num, sizeof(long));  /* 会初始化   */
long *p2 = (long *)malloc(num * sizeof(long)); /* 不会初始化 */

int i;
for (i = 0; i < num; i++) {
    printf("%d, %d\n", p1[i], p2[i]);
}

free(p1);
free(p2);
getchar();
return 0;

}

  1. realloc:

    include <stdio.h>

    include <stdlib.h>

int main(void)
{

int num = 10;
int i;

long *p = (long *)malloc(num * sizeof(long));
printf("内存地址: %p\n~~~~~~~~\n", p);

for (i = 0; i < num; i++) p[i] = i+1;
for (i = 0; i < num; i++) printf("%d\n", p[i]);

printf("------------------\n");

num = 4;
p = (long *)realloc(p, num*sizeof(long));
printf("内存地址: %p\n~~~~~~~~\n", p);
for (i = 0; i < num; i++) printf("%d\n", p[i]);

printf("------------------\n");

num = 20;
p = (long *)realloc(p, num*sizeof(long));
printf("内存地址: %p\n~~~~~~~~\n", p);
for (i = 0; i < num; i++) printf("%d\n", p[i]);

free(p);
getchar();
return 0;

}

  1. 判断内存是否分配成功:

    include <stdio.h>

    include <stdlib.h>

int main(void)
{

int *p = (int *)malloc(100);

if (p != NULL) printf("分配成功!\n");
if (p) printf("分配成功!\n");

if (p == NULL) printf("内存不足!\n");
if (!p) printf("内存不足!\n");

free(p);
getchar();
return 0;

}

支付宝打赏支付宝打赏 微信打赏微信打赏

如果文章或资源对您有帮助,欢迎打赏作者。一路走来,感谢有您!

标签: none

学点 C 语言(23): 数据类型 - 给指针分配内存