学点C语言(23):数据范例 – 给指针分派内存
当前位置:以往代写 > C/C++ 教程 >学点C语言(23):数据范例 – 给指针分派内存
2019-06-13

学点C语言(23):数据范例 – 给指针分派内存

学点C语言(23):数据范例 – 给指针分派内存

副标题#e#

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;
}

2. 给 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;
}


#p#副标题#e#

3. 像数组一样利用:

#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;
}

4. 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;
}

#p#副标题#e#

5. 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;
}

6. 判定内存是否分派乐成:

#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;
}

返回“学点C语言 – 目次”

    关键字:

在线提交作业