C语言给指针分配内存

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("%dn", *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,%dn", *p, *(p+1), *(p+2));

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

 

 

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, %dn", 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, %dn", p1[i], p2[i]);
  }

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

  5. realloc:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  int num = 10;
  int i;
  
  long *p = (long *)malloc(num * sizeof(long));
  printf("内存地址: %pn~~~~~~~~n", p);
  
  for (i = 0; i < num; i++) p[i] = i+1;
  for (i = 0; i < num; i++) printf("%dn", p[i]);

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

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

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

  num = 20;
  p = (long *)realloc(p, num*sizeof(long));
  printf("内存地址: %pn~~~~~~~~n", p);
  for (i = 0; i < num; i++) printf("%dn", 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;
}

 

 

 

转贴:http://tech.ddvip.com/2009-02/1235553719109748_2.html

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,可以使用malloc函数来动态分配内存指针。malloc函数的原型为void* malloc(size_t size),它接受一个size_t类型的参数,表示要分配的字节数。malloc函数返回一个指向分配内存指针,如果分配失败,则返回空指针NULL)。 使用malloc函数分配内存的基本步骤如下: 1. 定义一个指针变量,用于接收分配内存的地址。 2. 使用malloc函数分配内存,传入所需的字节数作为参数。需要注意的是,malloc函数返回的是void*类型的指针,通常需要进行强制类型转换。 3. 检查malloc函数的返回值是否为NULL,以确保内存分配成功。 4. 如果分配成功,可以通过指针变量进行操作和访问分配的内存空间。 5. 使用完毕后,记得使用free函数释放已分配的内存,以避免内存泄漏。 以下是一个示例代码,演示如何使用malloc函数分配内存指针: ```c #include <stdio.h> #include <stdlib.h> int main() { int* ptr = NULL; int n; printf("请输入要分配的元素个数:"); scanf("%d", &n); ptr = (int*) malloc(sizeof(int) * n); if (ptr != NULL) { printf("内存分配成功!\n"); // 可以对ptr指针进行操作和访问分配的内存空间 } else { printf("内存分配失败!\n"); } free(ptr); // 释放已分配的内存 return 0;} ``` 在上述代码中,我们首先定义了一个指向int类型的指针变量ptr,并初始化为NULL。然后,通过scanf函数获取要分配的元素个数n。接下来,使用malloc函数分配了n个int类型的内存空间,并将返回的地址强制类型转换为int*类型,并赋值给ptr。然后,我们检查ptr是否为NULL,以确定内存分配是否成功。最后,使用free函数释放已分配的内存。 需要注意的是,在使用malloc函数分配内存后,需要在不再使用分配的内存时及时使用free函数释放内存,以避免内存泄漏问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C语言学习笔记(指针 地址 动态内存分配)](https://blog.csdn.net/m0_62510826/article/details/126639863)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值