精华内容
下载资源
问答
  • C局部指针问题

    2021-03-16 15:01:46
    C局部指针问题代码片. 记录: 指针涉及两个内存: 1、指针本身内存 局部指针存放于栈上,当所处作用域消亡,会被自动销毁。 2、指针指向的内存 指针指向的内存位于堆上,即使指针所在作用域不存在了,该内存只要不被...

    C局部指针问题??记录:

    指针涉及两个内存:
    1、指针本身内存
    局部指针存放于栈上,当所处作用域消亡,会被自动销毁。

    2、指针指向的内存
    指针指向的内存如果是malloc则位于堆上,即使指针所在作用域不存在了,该内存只要不被释放则内存泄漏。

    char* test_location_pointer()
    {
        char *ch = "dasdasda";
        printf("a    %p\r\n",&ch);    //指针本身的地址
        printf("b    %p\r\n",ch);     //指针指向的地址
        
        return ch;
        //return &ch;    //编译器警告,返回了局部变量
    }
    

    编译器报警,局部指针。

    int main(void)
    {
        char *c = test_location_pointer();
        printf("c    %p = %ld\r\n\r\n",c,strlen(c));
        char *ch = test_location_pointer();
        printf("ch   %p = %ld\r\n",ch,strlen(ch));
        return 0;
    }
    

    结果:

    lestly@lestly-virtual-machine:~/桌面/code/pointer$ gcc pointer.c -o pointer
    lestly@lestly-virtual-machine:~/桌面/code/pointer$ ./pointer 
    a    0x7ffd69943e80
    b    0x5645bdeb1004
    c    0x5645bdeb1004 = 8
    
    a    0x7ffd69943e80
    b    0x5645bdeb1004
    ch   0x5645bdeb1004 = 8
    

    可以看到地址是不变,内容也不变,表明在堆上的内存依然存在。这个堆上的内存也不需要我们释放,系统会帮我们自动处理(未知??),一般我们只需要malloc和free配对即可。局部指针应该会被自动释放,但是它的地址也不变,是编译器优化吗??求解答。

    展开全文
  • 返回局部指针

    2016-09-01 12:37:41
    以前经常在C++/c 中听到,不能去返回局部指针。 导致现在ios,和cocos的开发都有一定的阴影。 当时对这句话的含义没有理解完全。所谓不能返回的局部指针。这个指针指向的一定是基础数据类型,在准确点指向的数据是...

    以前经常在C++/c 中听到,不能去返回局部指针。 导致现在ios,和cocos的开发都有一定的阴影。 当时对这句话的含义没有理解完全。

    所谓不能返回的局部指针。这个指针指向的一定是基础数据类型,在准确点指向的数据是存放在堆栈上面的。一般情况下基础数据类型都是放在堆栈上面。函数执行完毕后当前函数的堆栈都是要被清空的。所以这个时候你返回的局部指针指向的内存就已经被释放了!

    但是有时候我们还是可以返回局部指针的,程序中大多数都是这样的不是吗,cocos创建对象,ios创建对象返回的都是一个指针。 而这些数据他们其实是放在堆上面的。使用引用技术,或者其他的内存管理机制来管理这些数据。所以你反悔一个局部指针是没有任何问题的!

    展开全文
  • /* * @Date: 2019-3-12 ... 局部变量、局部指针变量的返回 为什么不能返回局部指针变量,却可以返回局部变量 函数的局部变量用作返回值时,会生成一个局部变量的拷贝用作返回值,之后局部变量会被系统回收, ...
    /*
     * @Date: 2019-3-12
     * @Author: tracycw
     * @Description: 
                    局部变量、局部指针变量的返回
                    为什么不能返回局部指针变量,却可以返回局部变量
                    函数的局部变量用作返回值时,会生成一个局部变量的拷贝用作返回值,之后局部变量会被系统回收,
                    函数不能返回局部变量的地址,因为如果返回局部变量的地址,系统回收后,指针指向的内容就无意义了,
                    但是对于静态变量也可以返回其指针。
     */
    
    #include <iostream>
    using namespace std;
    
    char* test1(void)
    {
    	// 栈区
    	char c[10] = "abcde";
    	return c;
    }
    
    char* test2(void)
    {
    	// 静态存储区
    	static char c[10] = "abcde";
    	return c;
    }
    
    char* test3(void)
    {
    	// 文字常量区
    	char *c = "abcde";
    	return c;
    }
    
    
    /* 
    c[]和str均保存在栈中;该函数返回值是保存在str指针中的c数组在栈中的存放地址,
    当调用该函数时,该地址被复制到外部的指针变量中,然后,保存在栈上的c[]数组和str指针的内存空间被释放。
    c[]数组的存放地址是被传送出去了的,但是,由于c[]是局部变量,在函数执行完成后,存放的内存空间就被释放,
    所以,在外部通过指针访问c[]数组时,指向的内存空间无效,而且还可能出现访问非法内存的危险。
    */
    char* test4(void)
    {
    	char c[10] = "abcde";
    	char *str = c;
    	return str;
    }
    
    int* test4_max(int* a, int* b)
    {
    	int* t;
    	if (*a >= *b)
    	{
    		t = a;
    	}
    	else
    	{
    		t = b;
    	}
    
    	return t;
    }
    
    int main()
    {
    	cout << test1() << endl;
    	cout << test2() << endl;
    	cout << test3() << endl;
    	cout << test4() << endl;
    
    	int a = 3, b = 5;
    	cout << "max is: " << *(test4_max(&a, &b)) << endl;
    	
    	system("pause");
    	return 0;	
    }

    输出结果:

    展开全文
  • Linux c 函数返回局部变量的指针和返回局部指针变量 最近再看c语言实用之道这本书,对于其中的一段代码不太清楚,关于c函数返回局部指针变量与返回局部变量的指针之间的区别,对于后者还是比较清楚的,前者一直有点...

    Linux c 函数返回局部变量的指针和返回局部指针变量

    最近再看c语言实用之道这本书,对于其中的一段代码不太清楚,关于c函数返回局部指针变量与返回局部变量的指针之间的区别,对于后者还是比较清楚的,前者一直有点懵,这次查阅一些资料,算是弄清楚了,在此作个记录。

    c语言函数之间的调用是通过栈帧(Stack frame)实现的,栈帧其实都是进程虚拟地址空间中栈区域分配的一块内存空间,X86架构下,栈是从进程虚拟地址空间中的高地址往低地址增长,栈的边界是通过两个寄存器EBP(栈基址)和ESP(栈地址)保存的,栈帧的销毁是通过移动ESP指针来实现的,没有真正的清理,所以当再次使用这块栈帧区域时,会遗留之前使用的垃圾值。

    下面的内容引用自C函数调用栈

    #include <stdio.h>
    
    int a();
    int b();
    int c();
    
    int a()
    {
      b();
      c();
      return 0;
    }
    
    int b()
    { return 0; }
     
    int c()
    { return 0; }
    
    int main()
    {
      a();
      return 0;
    }

    下图是函数调用的栈帧:

    可以看到,栈帧是可以复用的,对于c()函数来说,其分配的栈帧含有之前b()函数使用的值,但对于c()函数来说就是垃圾值。

    对于返回局部变量的指针或地址的c函数来说,该函数再返回后,其栈帧已被销毁,通过返回的指针去引用该销毁区域的变量是非常危险的,所以编译器会报警告。

    #include <stdio.h>
    
    int *ptr1(int n){
       return &n;
    }
    
    int *ptr2(int n){
        int val = n;
        return &val;
    }
    
    int main(void){
        int *nn = ptr1(7);
        printf("%d\n", *nn);
    }
    

    函数ptr1()和ptr2()返回了局部变量的地址,这两种情况都是不允许的。

    书中对ptr1()函数进行了修改返回一个局部的指针变量,

    int *ptr(int n) {
      int *p = &n; 
      return p;
    }

    编译不报警告,输出了数值7。 

    当说一个指针的时候,其实是指其所指向的变量,也就是该指针所保存的值,同时指针也是有地址的。但这个地址和其保存的地址值是不相关的。

    这里是返回了一个变量,其实是相当于返回了该变量的值,也就是该指针变量存储的地址值。函数返回一个局部变量的值是没有问题的。相当于main函数里的指针变量nn保存的是ptr函数栈帧空间里的变量n的地址,也就是说nn现在是指向一个销毁的栈帧空间里的地址,虽然该栈帧已销毁,但是并没有清理,所以输出了数值7。

    紧接着,作者有添加了一个nothing()函数,

    int *ptr(int n) {
        printf("ptr() &n = %p\n", &n);
        int *p = &n; 
        printf("ptr() &p = %p\n", &p);
        printf("ptr() p = %p\n", p); 
        return p;
    }
    
    void nothing(int n1) {
        printf("nothing() &n1 = %p\n", &n1);
        int n2 = n1; 
        printf("nothing() &n2 = %p\n", &n2);
    }
    
    int main(void){
        int *nn = ptr(7);
        printf("main() nn = %p\n", nn);
        printf("main() &nn = %p\n", &nn);
        nothing(10);
        printf("%d\n", *nn);
    }
    

    并在main()函数里进行了调用,输出数值10。

    ptr() &n = 0x7ffcecf14d6c
    ptr() &p = 0x7ffcecf14d70
    ptr() p = 0x7ffcecf14d6c
    main() nn = 0x7ffcecf14d6c
    main() &nn = 0x7ffcecf14d90
    nothing() &n1 = 0x7ffcecf14d6c
    nothing() &n2 = 0x7ffcecf14d74
    10

    这里把变量的地址打印出来进行观察,发现nothing()函数复用了之前销毁的ptr()函数的栈帧,nothing()函数中的n1变量的地址和ptr()函数中变量n的地址相同,都是int类型,所以该地址的值被nothing()函数进行覆写, 导致输出了10。

    展开全文
  • c语言 返回局部变量 局部指针 局部数组 内存四区模型  讨论这个问题之前,一定要理解堆区和栈区的工作原理,数据的存储区域(参考内存四区模型),另外一定不要返回局部对象或变量的引用和指针。 局部变量  ...
  • 内存管理与局部指针

    2019-04-03 16:05:34
    程序生命周期较短或者比较简单,可以不用考虑这些。不用看下去了。 局部指针在使用完毕之后要释放掉。(参数指针和返回指针 不在此论,因为外部还会有指向...所以使用局部指针的时候建议malloc() free() //...
  • 1.局部变量的指针和局部指针变量是两个不同概念 2.局部变量在函数体结束后生命期也结束,它的指针(即它的地址)是无效变量的地址,所以函数不能返回这种地址值 3,局部指针变量在函数结束后生命期也结束,但它...
  • 关于C语言中返回局部指针变量

    千次阅读 2017-12-26 18:18:51
    关于C语言中函数返回局部指针变量出错。
  • 对于返回局部指针变量的思考
  • 作为一个菜鸟级别的程序员,我也知道一句话叫做:不能返回局部指针变量最近有一个问题困扰了我很久,到底能不能返回局部变量。。局部指针变量。。。先看下面的代码#include #include #include <string.h>char *...
  • 第三:在函数内定义的局部指针,都是在栈区声明的,但可以指向栈区、堆区和静态区。是否能返回由指针的指向决定。只要不是指向栈区的,都能返回。 第四:在函数内使用全局指针时,一定要先定义一个局
  • c语言的里,在函数内部定义的局部指针变量是不能作为返回值的,但我在函数内部定义了一个局部的指针结构体,最后可以返回,这是为什么? 附上代码: ``` c Node_t * ReverseList(Node_t *head) { Node_t...
  • 局部指针变量

    2018-04-12 14:48:39
    c[]数组的存放地址是被传送出去了的,但是,由于c[]是局部变量, 在函数执行完成后,存放的内存空间就被释放,所以,在外部通过指针访问c[]数组时,指向的内存空间无效,而且还可能出现访问非法内存的危险。...
  • 昨天看到strcpy函数的典型实现时,发现该函数的返回值为局部指针变量,当时产生疑问:局部指针在函数结束时不是会被注销掉吗?为什么此处没有呢? 下面给出strcpy函数代码: char* Mystrcpy(char* strDest, const ...
  • 下面的程序运行正常,其实不然,它存在一个严重的问题:返回局部指针变量的错误用法。 #include #include int *fun(void) {  int a[10];  int *p;  int i;  for(i =0; i  {  a[i] = i;  } ...
  • 返回局部指针变量

    2017-11-24 21:07:33
    返回值为数值时,返回局部变量可以,而返回值为引用或指针时,则存在风险。 局部变量是存在于栈中的,函数被调用时先在栈中为变量申请空间,调用完成释放变量空间。函数在返回参数的时候是这样的,先把要返回的数...
  • C++智能指针与返回局部指针

    千次阅读 2017-09-20 22:25:31
    智能指针:对new对象进行智能的管理,跳出相关作用域会自动删除。 不需要再调用delete。对象删除会自动调用析构函数。 这里只记录:unique_ptr 与shared_ptr auto_ptr已经被unque_ptr替换 weak_ptr不是特别常用。...
  • 局部变量和局部指针

    2013-05-29 14:16:46
    char* fun_other() { char ss[] = "csadfasdfasd"; return ss; } char* fun() { char *ss = (char*)malloc(100); strcpy(ss,"fasdfasdf"); //free(ss);...int main() //局部变量和
  • #include #define ElemType char //节点声明,数据域、左孩子指针、右孩子指针 typedef struct BiTNode{ char data;...上面的代码中CreateTree()函数应该是返回了一个局部指针吧?这样写程序是不是不可靠?
  • 我们大家都知道指针函数的返回指针不能指向函数内的自动变量,如果需要返回函数的内部变量的话,就需要将该变量声明为静态变量。为什么函数能够返回 静态变量的地址而不能返回局部自动变量的地址,到底什么样的对象...
  • 常常碰到的问题,碰到函数局部变量指针的时候会出错。那么C++中函数局部变量指针是怎样释放的呢? 在函数内定义的变量所占的内存会在函数返回时被清空,因此若是以局部变量做返回值,会返回一个空值。 详细说一下...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,896
精华内容 2,758
关键字:

局部指针