前幾天朋友問了有關 C語言 記憶體配置的問題,一直搞不定,只好再次拿出許久的 C語言 講義摸索

特此在這裡記錄一下心得。

常用記憶體配置

一般來說我們記憶體配置標準寫法如下:

malloc.c
#include <stdio.h>
#include <stdlib.h>
int main()
{
    char* ch = NULL;
    ch = (char*)malloc(sizeof(char));
    return 0;
}

我們增加的是指標ch,增加ch指到更多記憶體,就能表示字元陣列。

透過函式記憶體配置

那當我們想模組化,透過函式記憶體配置要怎麼做呢?

常常會以為用平常傳址函式的寫法就可以了,如下:

錯誤寫法
#include <stdio.h>
#include <stdlib.h>
void getMemory(char* s)
{
    s = (char*)malloc(sizeof(char));
}
int main()
{
    char* ch = NULL;
    getMemory(ch);
    return 0;
}

結果試半天是錯的,其實仔細一想既然ch = NULL,丟進去函式裡面,函式怎麼知道ch是位於哪裡然後給ch位置呢?

因此這時就需要用到雙重指標來把ch的位置傳進去

正確寫法如下:

fun_malloc.c
#include <stdio.h>
#include <stdlib.h>
void getMemory(char** s)
{
    *s = (char*)malloc(sizeof(char));
    printf("s = %p\n", s);
    printf("*s = %p\n", *s);
}
int main()
{
    char* ch = NULL;
    getMemory(&ch);
    printf("&ch = %p\n", &ch);
    printf("ch = %p\n", ch);
    return 0;
}

使用printf印出記憶體位置:

s = 0x7fff5d2ebc00
*s = 0x7f943bc000e0
&ch = 0x7fff5d2ebc00
ch = 0x7f943bc000e0

由此可知s == &ch*s == ch,然後函式裡面增加*s的位置,這樣就可以達到我們的目的了。