程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 學點C語言(23):數據類型 - 給指針分配內存

學點C語言(23):數據類型 - 給指針分配內存

編輯:關於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("%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;
}

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

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語言 - 目錄”

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved