【C语言笔记】指针函数中可以返回什么样的指针,从两个例子开始(上)

关于指针函数的两个例子:

第一个例子:下面这段代码是否能正确运行?

#include<stdio.h>

char * get_string() {
    char *s = "hello";
    return s;
}

int main() {
    char *p; 
    p = get_string();
    printf("p=%s\n", p); 
}

因为s指向的是字符串常量,被存储在静态区(全局区)中,所以可以返回给main,运行结果正常。

p=hello

 第二个例子:下面这段代码是否还能正常运行?

#include<stdio.h>

char * get_char_array() {
    char ch[10] = {'h', 'e', 'l', 'l', 'o', '\0'};
    return ch; 
}

int main() {
    char *q; 
    q = get_char_array();
    printf("q=%s\n", q); 
    return 0;
}

运行结果如下:

warning: function returns address of local variable [enabled by default]

q={�������P(f���9���{�����r�����{�U��~�

原因是函数返回的是一个局部变量的地址,主函数无法访问,指针q变成了野指针,所以输出的结果无法预知。既然如此,有哪些解决办法呢?从指针函数返回的指针类型入手。

指针函数中可以返回什么样的指针?

  • 字符串常量的地址

上述第一个例子可以正常运行,是因为指针s指向的是字符串常量,被存储静态区(全局区)中,不管是不是在主函数中都可以访问,因此不会报错。

  • static变量的地址

    char * get_char_array() {
        static char ch[10] = {'h', 'e', 'l', 'l', 'o', '\0'};
        return ch; 
    }

    既然存在静态区(全局区)中的变量可以解决主函数无法访问的问题,那直接将变量定义为static变量也能解决问题,所以,第二个例子中的代码更改如上,运行结果:

    q=hello
  • 全局变量的地址

在非主函数中定义的局部变量的地址,在主函数中无法访问,那如果直接将变量定义为全局变量,程序中的所有函数均可访问,也能解决问题,上述第二个例子中的代码还可以改成:

char ch[10] = {'h', 'e', 'l', 'l', 'o', '\0'};

char * get_char_array() {
    return ch; 
}

运行结果如下:

q=hello

把变量定义在所有函数之外,确实能解决主函数无法访问局部变量的问题,但同时也给程序的稳定性和安全性带来了一定挑战,编程过程中要特别注意,以免得到意想不到的答案。

  • 主调函数中有效内存地址

这种方法是直接在主函数中定义指向有效内存地址的指针,将其传递给函数,在函数内通过指针访问所指向的对象,并对其进行操作,所以第二个例子又可以更改为:

#include<stdio.h>

char * get_char_array(char *ch) {
    return ch;
}

int main() {
    char *q;
    char ch[10] = {'h', 'e', 'l', 'l', 'o', '\0'};
    q = get_char_array(ch);
    printf("q=%s\n", q); 
    return 0;
}

运行结果如下:

q=hello

在这个例子中,将字符数组ch定义在main函数内,并将指向ch的指针传递给函数get_char_array,然后又返回指针,这个例子中,get_char_array没有对ch进行任何操作,只是为了说明这种方法。

  • 堆的地址

这种方法下次再记笔记。

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式进阶行者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值