首页 > 其他分享 >【笔记】指针函数中可以返回什么样的指针,从两个例子开始(上)

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

时间:2024-06-18 21:30:29浏览次数:12  
标签:ch 函数 get 笔记 char 例子 array 指针

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

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

#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进行任何操作,只是为了说明这种方法。

  • 堆的地址

这种方法下次再记笔记。

标签:ch,函数,get,笔记,char,例子,array,指针
From: https://blog.csdn.net/boy_ding_jian/article/details/139719195

相关文章

  • python编程笔记
    pythonimport库失败:原因是解释器选择不对,pip3installnumpy是把numpy库安装在3.xxx的python解释器中,但是我是在3.9.6的解释器下运行的,所以找不到,此时需要把解释器换成3.11.9即可。Super(Net,self)._init_()这是对继承自父类的属性进行初始化,子类继承了父类的所有属性......
  • Stable Diffusion 3 大模型文生图“开源英雄”笔记本部署和使用教程,轻松实现AI绘图自
    备受期待的StableDiffusion3(以下亦简称SD3)如期向公众开源了(StableDiffusion3Medium),作为StabilityAI迄今为止最先进的文本生成图像的开源大模型,SD3在图像质量、文本内容生成、复杂提示理解和资源效率方面有了显著提升,被誉为AI文生图领域的开源英雄。StableDiffusion......
  • Stable Diffusion 3 大模型文生图“开源英雄”笔记本部署和使用教程,轻松实现AI绘图自
    备受期待的StableDiffusion3(以下亦简称SD3)如期向公众开源了(StableDiffusion3Medium),作为StabilityAI迄今为止最先进的文本生成图像的开源大模型,SD3在图像质量、文本内容生成、复杂提示理解和资源效率方面有了显著提升,被誉为AI文生图领域的开源英雄。StableDiffusion3Medi......
  • 【C语言】数组参数和指针参数详解
    在写代码的时候难免要把【数组】或者【指针】传给函数,那函数的参数该如何设计呢?1一维数组传参#include<stdio.h>voidtest(intarr[])//ok?{}voidtest(intarr[10])//ok?{}voidtest(int*arr)//ok?{}voidtest2(int*arr[20])//ok?{}voidtest2(int**arr)//ok?......
  • CSS学习笔记
    一、盒子模型1.简介盒子模型是网页布局的基础,将页面中所有元素都看作是一个盒子,盒子都包含以下几个属性:width宽度height高度border边框padding内边距margin外边距2.盒子模型2.1border表示盒子的边框分为四个方向:上top、右right、下bottom、左leftborder-top......
  • LLM学习笔记
    1.评估榜单1.1.C-EvalC-Eval是一个全面的中文基础模型评估套件。它包含了13948个多项选择题,涵盖了52个不同的学科和四个难度级别。https://cevalbenchmark.com/static/leaderboard_zh.html?ref=nav.6aiq.com全部都是各个学科的选择题,例如:企业联合是指企业之间为增强市......
  • 算法课程笔记——普通莫队
    算法课程笔记——普通莫队......
  • 算法课程笔记——单调栈&单调队列
    算法课程笔记——单调栈&单调队列......
  • 02-Excel初阶操作-学习笔记
    数据透视表专题续利用筛选字段切换数据场景:在数据透视表中显示各个所属地区每个月筛选出宠物用品类别,销售部门为三科的发生额,并在会议时展示,样例如下所示。具体操作step1:制作数据透视表点击任意单元格——插入选项卡——数据透视表——将“订购日期”拖拽到行字段,“所......
  • 当char型变量遇上char*型的指针
    #include<stdio.h>intmain(void){ char*i=(char*)0x1111; printf("size=%d%d\n",sizeof(i),sizeof((char*)0x11));//sizei=8bytes,size(char*)0x11=8bytes,cause0x11isconveredtochar*,char*isaponinterandhas64......