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