精华内容
下载资源
问答
  • C语言返回地址的问题

    2016-07-15 09:33:38
    以下2个函数为什么一个可以返回地址,一个不可以? #include "stdlib.h" #include "stdio.h" char *return_1(void) { char x[12] = "1111"; return x; } char *return_2(void) { char *x = "2222"; ...
  • https://blog.csdn.net/yang382197207/article/details/25873039

    https://blog.csdn.net/yang382197207/article/details/25873039

    展开全文
  • 结论:函数可以返回局部变量的...但是如果返回局部变量的地址,那么返回的是该局部变量地址的值拷贝,但是函数运行结束,该拷贝指针所指向的栈内容已经被释放即为野指针,对野指针所指向内容的操作都会造成段错误 ...

    结论:函数可以返回局部变量的值,但是不能返回指向栈内存的指针。
    原因:
    局部变量的作用域为函数内部,函数执行结束,操作系统会自动释放栈上的局部变量。并且函数返回的是局部变量的值拷贝。但是如果返回局部变量的地址,那么返回的是该局部变量地址的值拷贝,但是函数运行结束,该拷贝指针所指向的栈内容已经被释放即为野指针,对野指针所指向内容的操作都会造成段错误
    函数是可以返回指向堆内存的指针,但是这需要在调用者在函数外手动进行内存的释放,这样的接口很烂。可以通过指针传递来解决。

    展开全文
  • C语言返回局部变量

    千次阅读 2019-04-11 16:24:42
    因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。故函数是可以返回局部变量的。 但是如果函数返回的是局部变量的地址(指针)的话,程序运行就会报错。由于只是把指针(地址)复制后返回了,而指针...

      局部变量的作用域在函数的内部,函数返回后,局部变量内存已经释放掉了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。故函数是可以返回局部变量的。

            但是如果函数返回的是局部变量的地址(指针)的话,程序运行就会报错。由于只是把指针(地址)复制后返回了,而指针指向的内存(存储的内容)已经被释放了,这样指针无访问该内存的权限,调用后就会报错。

           准确的说,函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。
      案例一:

    #include <iostream>
    
    using namespace std;
    
    char* GetStr0()
    {
        char* ch = "hello world!"; 
        return ch;
    }
    
    void main()
    {
        char* p = nullptr;
        p = GetSt0();
        cout << "GetStr0() : " << p << endl;
    }

       运行返回"hello world!",由于"hello world!"是一个字符串常量,存放在只读数据段(常量区),把该字符串常量存放的只读数据段的首地址赋值给了指针,所以GetStr函数退出时,该字符串常量的内存不会被系统回收,故能够通过指针顺利无误的访问。  

       案例二:

    "hello world!"是局部变量存放在栈中。当GetStr1()函数退出时,栈要清空,局部变量的内存也被清空了,所以函数返回的是一个已被释放的内存地址,打印出来的是乱码。 

    案例三:

    int func()  
    {  
          int a;  
          ....  
          return a;    //可以
    }                     
      
    int * func()  
    {  
          int a;  
          ....  
          return &a;    //无意义,内存释放
    } 

      

            局部变量可分为局部自动变量和局部静态变量,由于a返回的是值(指针指向的内容),故无论是自动还是静态个局部变量是可以的返回的,因为这时返回的是局部变量的值。但不应该返回指向局部自动变量的指针,因为函数调用结束后该局部自动变量被释放了,该指针指向一个已经不再存在的对象,是无意义的。但可以返回指向局部静态变量的指针,因为静态变量的生存期从定义起到程序结束。

    展开全文
  • c语言返回局部变量

    2017-07-02 14:35:13
    因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的...
     一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。
    

        下面以函数返回局部变量的指针举几个典型的例子来说明:

    #include <stdio.h>   
    char *returnStr()   
    {   
        char p[]="hello world!";   
        return p;   
    }   
    int main()   
    {   
        char *str;   
        str=returnStr();   
        printf("%s\n", str);   
        return 0;   
    }   
    这个没有任何问题,因为"hello world!"是一个字符串常量,存放在只读数据段,把该字符串常量存放的只读数据段的首地址赋值给了指针,所以returnStr函数退出时,该该字符串常量所在内存不会被回收,故能够通过指针顺利无误的访问。

    2:

    #include <stdio.h>   
    char *returnStr()   
    {   
        char p[]="hello world!";   
        return p;   
    }   
    int main()   
    {   
        char *str;   
        str=returnStr();   
        printf("%s\n", str);   
        return 0;   
    }   
    "hello world!"是局部变量存放在栈中。当returnStr函数退出时,栈要清空,局部变量的内存也被清空了,所以这时的函数返回的是一个已被释放的内存地址,所以有可能打印出来的是乱码。

    3:

    int func()  
    {  
          int a;  
          ....  
          return a;    //允许  
    }                     
      
    int * func()  
    {  
          int a;  
          ....  
          return &a;    //无意义,不应该这样做  
    }   

    局部变量也分局部自动变量和局部静态变量,由于a返回的是值,因此返回一个局部变量是可以的,无论自动还是静态,因为这时候返回的是这个局部变量的值,但不应该返回指向局部自动变量的指针,因为函数调用结束后该局部自动变量被抛弃,这个指针指向一个不再存在的对象,是无意义的。但可以返回指向局部静态变量的指针,因为静态变量的生存期从定义起到程序结束。


    4:如果函数的返回值非要是一个局部变量的地址,那么该局部变量一定要申明为static类型。如下:

    #include <stdio.h>   
    char *returnStr()   
    {   
        static char p[]="hello world!";   
        return p;   
    }   
    int main()   
    {   
        char *str;   
         str=returnStr();   
        printf("%s\n", str);   
      
        return 0;   
    }   

    5: 数组是不能作为函数的返回值的,原因是编译器把数组名认为是局部变量(数组)的地址。返回一个数组一般用返回指向这个数组的指针代替,而且这个指针不能指向一个自动数组,因为函数结束后自动数组被抛弃,但可以返回一个指向静态局部数组的指针,因为静态存储期是从对象定义到程序结束的。如下:

    int* func( void )  
    {  
        static int a[10];  
        ........  
        return a;  
    }  
    6:返回指向堆内存的指针是可以的

    char *GetMemory3(int num)  
    {  
    char *p = (char *)malloc(sizeof(char) * num);  
    return p;  
    }  
    void Test3(void)  
    {  
    char *str = NULL;  
    str = GetMemory3(100);  
    strcpy(str, "hello");  
    cout<< str << endl;  
    free(str);  
    }  

    程序在运行的时候用 malloc 申请任意多少的内存,程序员自己负责在何时用 free释放内存。动态内存的生存期由程序员自己决定,使用非常灵活。


    展开全文
  • 在反外挂系统中,经常会检测函数的返回地址,确认函数的返回地址在规定的范围之内,从而保证,游戏程序中的函数,不被外挂所调用。这种检查方式就涉及到一个基本的技术问题,如何获得函数的返回地址?例如下面的第一...
  • 定义一个int类型函数返回地址的值,在主函数定义一个指针变量来解引用 是不是和定义一个指针函数是一样的 地址不就是整数吗,定义的类型就是打开这串数据的方式,我觉得应该是可以的吧,有没有大佬解决一下问题 ...
  • C语言返回字符串的四种方式

    千次阅读 2017-06-29 10:21:13
    C语言返回字符串有四种方式:1。使用堆空间,返回申请的堆地址,注意释放2。函数参数传递指针,返回该指针3。返回函数内定义的静态变量(共享)4。返回全局变量使用分配的内存,地址是有效 一:使用堆空间,返回...
  • C语言返回一个数组

    千次阅读 2019-04-12 12:49:56
    1.使用全局变量 2.使用静态局部变量 3.在函数内动态分配内存 4.在函数调用参数中传入数组地址
  •   c语言函数返回局部变量地址。 分析:   c语言函数是不能返回局部变量地址,除非是局部静态变量地址,但可以返回局部变量数值。其原因是局部变量的作用域只在函数内,当程序调用完函数后,局部变量会随此函数...
  • #include<stdio.h> int* address(); int* address() { int a=2; return &a; } int main() { int* p=address(); printf("%d\n",*p); return 0; } 结果还是2,局部变量a不...值仍然存在还是2,用的vs2010
  • C语言返回字符串函数,或者通过一个函数改变主函数中某个字符串变量的值有四种方式: 1。使用堆空间,返回申请的堆地址,注意释放 2。函数参数传递指针,返回该指针 3。返回函数内定义的静态变量(共享) 4。...
  • C语言返回局部变量

    2021-05-09 09:37:53
    返回局部变量的值(地址)数组与指针的情况三、返回在堆中的局部变量总结 概述 题主在编写函数之时发现返回一个指针变量之时屡屡出现错误,后来发现其实是对内存的理解不足导致的,如今我将函数的返回细细梳理,以...
  • buffer起始地址可以先填个错的返回地址由输出得到, 之后再改一下) run $(python -c 'print "\x90" * 10 + "\xeb\x3f\x5f\x80\x77\x0b\x41\x48\x31\xc0\x04\x02\x48\x31\xf6\x0f\x05\x66\x81\xec\xff\x0f\x48\x8d\x...
  • 指针可以根据地址直接操作内存中的数据,使用得当的话,不仅能使代码量变少,还能优化内存管理、提升程序性能。关于指针的内容还非常多,比如指针数组、指向数组的指针、指向指针的指针,呵呵,看到这些名字是否都...
  • 问题出在如此想了一下C语言如何实现返回一个字符串数组,答之:没有这种功能,但是吧,还是有办法实现的。那就是指向数组的指针解释char **p 这个p就是指向数组的指针,它指向一个数组的起始地址. 想要引用里面的...
  • C语言函数返回指针问题 今天写代码时想用一个函数返回一个结构体指针,结果出错了,然后做一个总结。 下面是出错的示例: int *fun( ) { int a ; return &a; // 返回局部变量的地直,返回后这个变量已不存在了...
  • C语言基础知识:C语言函数调用怎么返回两个值

    万次阅读 多人点赞 2018-09-22 11:45:29
    C语言中,函数只能返回一个值,要返回两个值,可以改换思路,通过其它方式做到。 1 建立数组,返回指针。 在要返回的两个值类型...a) 使用静态局部变量存储,并返回地址; b) 使用全局变量存储,返回地址; c...
  • (20130904)转自:...因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数...
  • C语言 - 返回一个数组

    千次阅读 2019-10-10 18:46:15
    题目 如下函数是否存在问题?如果存在问题如何修改?同时简要阐述涉及的相关概念。 char *GetString(void) { char str[] = "hello"; //开辟一个能连续存放6...简单几行代码,一眼就可以看出:这是一个C语言返回数组...
  • 1、如果一个函数它的返回值是一个地址(是一个指针的话),这个函数是一个返回值是指针即指针函数。 2、返回指针的函数是函数,而不是指针 注意函数指针和指针函数是不一样的概念 int (*p)(int,int);//这是是指向...
  • C语言返回字符串函数共有四种方式,分别如下:使用堆空间,返回申请的堆地址,注意释放、函数参数传递指针,返回该指针、返回函数内定义的静态变量(共享)、返回全局变量
  • c语言实现mac地址合法性检测,成功返回1,失败返回0
  • C语言返回字符串函数共有四种方式,分别如下: 使用堆空间,返回申请的堆地址,注意释放 函数参数传递指针,返回该指针 返回函数内定义的静态变量(共享) 返回全局变量 下面来看看详细的介绍 其实就是要返回一...
  • 利用函数堆栈溢出,修改函数返回地址,进而调用别的函数。 测试环境: win10 x86-64 gcc: x86_64-pc-cygwin 代码 #include <stdio.h> #include <stdlib.h> #include <string.h> int ...
  • C语言--返回局部变量的地址

    千次阅读 2013-07-27 13:02:36
    }当然,这是合理的写法,使函数的返回值为 int ,所以,调用函数后会返回一个int型的值。今天,我想讨论的问题当然不是这个,请看下面这段代码:char* Func_1(void){ char str[30] = "Bruce"; cout return str; //?...
  • 来看这样一段代码 int func() { ...这段代码非常简单,func 函数返回一个指向局部变量的地址,main 函数中调用 func 函数,获取到指针后将其设置为 20。你能看出这段代码有什么问题吗?问题在于局部变量 ...
  • 今天遇到个赋值返回的问题,查了一下,结果惊呆了了。 #include &lt;stdio.h&gt; int main() { int a = 1; int c = (a*=2) + (a+=3); printf("a = %d, c = %d\n", a, c); return 0; } int c...
  • 关于C语言函数返回数组的问题

    万次阅读 2016-11-29 23:03:52
    关于C语言函数返回一个数组 c语言中函数不能直接返回一个数组,但是可以用其他方式实现类似功能,不过需要注意: 1、该数组不能是返回函数的局部变量数组,因为局部变量数组在退出函数后会被释放。 可以是全局变量,...
  • 通过下面的代码,即可找到函数的返回地址: #include int evil(int para) { int var = 10; printf("evil\n"); printf("address ¶ is:%p, has value:%p\n", ¶, (void*) *(¶) );

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,803
精华内容 1,121
关键字:

c语言返回地址

c语言 订阅