c++返回指针问题

无欢Godric 2017-09-02 11:05:10
先上代码,这是剑指offer上一道题。
//反转链表
ListNode* ReverseIteratively(ListNode* pHead)
{
ListNode* pReversedHead = NULL;
ListNode* pNode = pHead;
ListNode* pPrev = NULL;
while(pNode != NULL)
{
ListNode* pNext = pNode->m_pNext;

if(pNext == NULL)
pReversedHead = pNode;

pNode->m_pNext = pPrev;

pPrev = pNode;
pNode = pNext;
}

return pReversedHead;
}


之前看都没注意,但是今天又翻了一遍,发现程序中pReversedHead不是属于局部变量么,而且并不是动态分配的,所以应该是存在栈区吧?当返回值以后内存会释放,那么此时指向该内存地址的指针不是会出错么?困扰一上午了,查了半天也没找到合适的解释,故来求教。下面代码类似
char * upper(char *str) {
char *dest = str;
while (*str != '\0')
{
if (*str >= 'a' && *str <= 'z')
*str -= 'a' - 'A';
str++;
}

return dest;
}
...全文
97 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2017-09-02
  • 打赏
  • 举报
回复
它返回的是一个地址值,这个局部变量存放的地址值,这个地址值指向的区域可不是本函数里的; 就像 int a = 4; return a;一样。想要的是它的值。
char * upper(char *str) {
    char *dest = str;    
    while (*str != '\0')
    {
        if (*str >= 'a' && *str <= 'z') 
            *str -= 'a' - 'A';
        str++;
    }
     
    return dest;
}
这个函数里返回的dest是str的地址。它和这样的还不一样:

char *func(void)
{
    char test[] = "hello";
    return test;
}
这个是返回局部的变量(虽然也是地址,但是这个地址指向的是局部的)
无欢Godric 2017-09-02
  • 打赏
  • 举报
回复
ls2位说的都是对的,但是没有完全解开我的疑惑,又查了下找到我想要的答案了。
引用 16 楼 cao_julians 的回复:
1.局部变量的指针和局部指针变量是两个不同概念 2.局部变量在函数体结束后生命期也结束,它的指针(即它的地址)是无效变量的地址,所以函数不能返回这种地址值 3,局部指针变量在函数结束后生命期也结束,但它指向的变量或函数或任何存储实体的生命期没有结束,函数返回的指针(地址)就是有效的
原帖地址http://bbs.csdn.net/topics/340065770 这里我犯了和1楼回答一样的错,这里的指针没有理解彻底,以为和局部变量一样了,所有才有了这个问题。
嘿碳头 2017-09-02
  • 打赏
  • 举报
回复
函数里的定义的变量都是存在栈里的,在函数结束后都是要释放的,那么我们看一下,你在函数里定义了那些变量, pReversedHead , pHead , pPrev(也就这三个指针),函数执行完毕后,指针的值被释放掉,指针指向的内存,并没释放,而你利用指针已经对只想的内存进行了反转操作,最后return一个反转后的头指针就行了。
大米粥哥哥 2017-09-02
  • 打赏
  • 举报
回复
指针指向的内存没有被释放

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧