程序结构之返回指针的函数

返回指针的函数:

  • 返回本地变量的地址是危险的
  • 返回全局变量或者静态本地变量的地址是安全的
  • 返回在函数内 malloc 的内存是安全的,但是容易造成问题
  • 最好的做法是返回传入的指针

实例:

#include<stdio.h>
int* f(void);
void g(void);

int main(int argc,char const *argv[]) {
    int *p = f();
    printf("*p=%d\n",*p);
    g();
    printf("*p=%d\n",*p);
    return 0;
}

int* f(void) {
    int i = 12;
    printf("&i=%p\n",&i);
    return &i;
}

void g(void) {
    int k = 24;
    printf("k = %d,&k = %p\n",k,&k);
}

编译有警告提示返回了本地变量的地址:

 warning: function returns address of local variable

运行结果:

&i=0xffa5c044
*p=12
k = 24,&k = 0xffa5c044
*p=24

可以发现两个不同函数的本地变量竟然使用的是同一地址,这样也就说明了为什么返回本地变量的地址是不安全的,如果观察编译中生成的汇编代码可以发现,两个函数调用时堆栈指针指的是同一个堆栈内存。

Tips:

  • 不要使用全局变量来在函数间传递参数和结果
  • 尽量避免使用全局变量
    • 丰田汽车的案子(据说是使用了过多的全局变量)
  • 使用全局变量 和静态本地变量的函数是线程不安全的,或者是不可重入的,

多线程程序中全局变量可能会由于多个线程同时访问而出现错误。

原文地址:https://www.cnblogs.com/songbeyond/p/12507307.html

时间: 2024-10-12 14:01:46

程序结构之返回指针的函数的相关文章

【C语言】-返回指针的函数与指向函数的指针

本文目录 前言 一.返回指针的函数 二.指向函数的指针 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.iOS开发不感兴趣,请忽略 回到顶部 前言 前面我们花了接近3个章节学习指针,应该都感受到指针的强大了吧.指针可以根据地址直接操作内存中的数据,使用得当的话,不仅能使代码量变少,还能优化内存管理.提升程序性能.关于指针的内容还非常多,比如指针数组.指向数组的指针.指向指针的指针,呵呵,看到这些名字是否

【学习笔记】【C语言】返回指针的函数

函数如果带*的返回的就是指针 char *test(){ } 1 #include <stdio.h> 2 char *test(); 3 4 /* 5 返回指针的函数 6 */ 7 8 int main() 9 { 10 char *name = test(); 11 12 printf("name=%s\n", name); 13 14 return 0; 15 } 16 17 char *test() 18 { 19 return "rose";

指向函数的指针与返回指针的函数

字面看就可以看出二者的区别,指向函数的指针即指针指向的地址为某个函数,而返回指针的函数为某个函数返回值是指针. 下面具体说: 1.指向函数的指针 bool (*ptr)(int a); 解析:声明指针ptr,指向的函数带有一个int形参,并返回bool型变量.注:*ptr两边的括号是必须的.否则如下: bool *ptr(int a); 为返回指针的函数,函数名ptr,参数为int 返回bool型指针变量. 2.指向函数的指针的初始化 只能通过0或者同类型的函数或函数指针进行初始化.可以用函数直

返回指针的函数与指向函数的指针的用法

#include<stdio.h> #include<stdlib.h> void *func(){ /* * 一种很容易犯的错误,将局部变量的地址返回 */ int m; printf("define as void *func()/n"); return &m; } /* * 声明一个指向函数的指针,指向返回类型为void指针的函数 */ void *(*pfunc)(); /* void (*pfun)(); * 声明一个函数,指向一个返回void

返回指针的函数

/* 1. 看懂语法 2. 定义指向函数的指针: double(*p)(double,char *,int); p = haha; or double (*p)(double,char *,int)=haha; 3.如何间接调用函数 1. p(19.7,"jack",10); 2. (*p)(19.7,"jack",10); */ #include <stdio.h> int main(int argc, char *argv[]) void test(

从函数返回指针

C++ 从函数返回指针 C++ 指针 C++ 指针 在上一章中,我们已经了解了 C++ 中如何从函数返回数组,类似地,C++ 允许您从函数返回指针.为了做到这点,您必须声明一个返回指针的函数,如下所示: int * myFunction() { . . . } 另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量. 现在,让我们来看下面的函数,它会生成 10 个随机数,并使用表示指针的数组名(即第一个数组元素的地址)来返回它们,具体如下: #include <i

返回指针值的函数

返回指针型的数据 即地址 例如: int *(int x,int y), a是函数名,调用它以后能得到一个in * 指针,即整形数据的地址,x 和 y是函数a的形参为整数 定义返回指针的函数一般的形:      类型名 *函数名(参数列表):   下面通过一个例子来初步了解 #include<stdio.h> int main() { float score[][4]={{50,70,80,90},{56,89,67,88},{34,78,90,66}}; float *search(floa

C++从函数返回指针

C++ 允许您从函数返回指针.为了做到这点,必须声明一个返回指针的函数,如下所示: int * myFunction() { . . . } 另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量. 现在,来看下面的函数,它会生成 10 个随机数,并使用表示指针的数组名(即第一个数组元素的地址)来返回它们,具体如下: #include <iostream> #include <ctime> using namespace std; // 要生成和返回

函数指针、函数指针数组

参考:百度百科 |函数指针|词条. 指针_函数,就不说了.自己感觉就是So-easy的.[ 声明格式:returnType *Function(arguments); ] 重点是 函数指针,以及突然冒出来的 函数指针数组;(特别说明,我习惯先写代码,再写注释:情况A:代码在左,注释向右.情况B:代码在上,注释在下.) 函数指针,我形象的描述 函数<-指针,(文中一切有问题请指正,谢谢).[声明格式: returnType(*pointer)(arguments); ] 举例: int fun(i