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 被赋值进函数内部进行操作,不会影响到原值,

同样,传入一级指针,智能修改它指向的数据,不能修改它指向的地址

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值