C語言在子函數中調用malloc申請內存

#include <stdio.h>                                                                                                  
#include <stdlib.h>
#include <string.h>
 
void test1(char **str)
{
    char a[] = {"hello world!"};
    *str = (char *)malloc(20);
    strncpy(*str, a, 20);
}
 
char* test2()
{
    char a[] = {"hello world!"};
    char *str = NULL;
    str = (char *)malloc(20);
    strncpy(str, a, 20);
    return str;
}
 
void test3(char * str)
{
    char a[] = {"hello world!"};
    str = (char *)malloc(20);
    strncpy(str, a, 20);
}
 
int main(int argc, char *argv[])
{
    char *test1_str = NULL;
    char *test2_str = NULL;
    char *test3_str = NULL;
 
    test1(&test1_str);
    printf("test1_str = %s\n",test1_str); //test1_str = hello world!
 
    test2_str = test2();
    printf("test2_str = %s\n",test2_str); //test2_str = hello world!
 
    test3(test3_str);
    printf("test3_str = %s\n",test3_str); //test3_str = (null)
 
    free(test1_str);
    free(test2_str);
    free(test3_str);
 
    return 0;
}

1、二級指針(正確)eg:test1使用的方法

    將malloc得到的內存首地址通過二級指針返回到主函數

2、函數返回(正確)eg:test2使用的方法

    將malloc得到的內存首地址通過函數返回值返回到主函數

3、一級指針(錯誤)eg:test3使用的方法

    看上去沒有問題,實際分析會有問題,用我們常用的例子進行分析即可看出

#include <stdio.h>
void test(char c)
{
    c = 'B';
}
void main()
{
    char ch = 'A' ;
    test(ch);
    printf("%c\n", ch);
}


輸出的值爲‘A’而不是‘B’,調用函數時,char c 被賦值進函數內部進行操作,不會影響到原值,

同樣,傳入一級指針,智能修改它指向的數據,不能修改它指向的地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章