吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1330|回复: 17
收起左侧

[已解决] 函数指针参地址为什么会变?

[复制链接]
Pammer 发表于 2020-4-19 22:45
本帖最后由 Pammer 于 2020-4-20 12:43 编辑

如下代码,为什么两次cout输出的不一样?
[C++] 纯文本查看 复制代码
#include<iostream>
using namespace std;

void a(const char*);

int main()
{
        char* b = new char[1];
        cout << &b << endl;
        a(b);
        return 0;
}

void a(const char* b)
{
        cout << &b << endl;
        return;
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

寒尘丶Coldust 发表于 2020-4-19 22:58
猜测可能是系统开启了ASLR?
聪明王子 发表于 2020-4-19 23:00
本帖最后由 聪明王子 于 2020-4-19 23:01 编辑

@Pammer   因为main函数中的&b返回的是main中的b指针本身的内存地址,而函数a中的&b返回的是函数a中的b指针本身的内存地址,两者虽然指针指向的内容相同,但是它们本身并不是一个指针,所以会返回两个不一样的内存地址

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
absman1972 + 1 + 1 用心讨论,共获提升!

查看全部评分

 楼主| Pammer 发表于 2020-4-19 23:02
聪明王子 发表于 2020-4-19 23:00
@Pammer   因为main函数中的&b返回的是main中的b指针本身的内存地址,而函数a中的&b返回的是函数a中的b指针 ...

我知道这个,就像副本一样,对吧?
如果我想让参数b和char*变量a地址一样,那该咋办?
bp946 发表于 2020-4-19 23:10
Pammer 发表于 2020-4-19 23:02
我知道这个,就像副本一样,对吧?
如果我想让参数b和char*变量a地址一样,那该咋办?

a(char* &b) 即可
聪明王子 发表于 2020-4-19 23:28
Pammer 发表于 2020-4-19 23:02
我知道这个,就像副本一样,对吧?
如果我想让参数b和char*变量a地址一样,那该咋办?

我觉得这种情况是不可能存在的,因为两个尚未被析构函数当中的局部变量的本身的内存地址是不可能一样的,它们本质上就是两个变量,它们都会分别占一定空间的内存,而这两个变量,它们不可能在栈中占同一空间同一内存。
聪明王子 发表于 2020-4-19 23:38
Pammer 发表于 2020-4-19 23:02
我知道这个,就像副本一样,对吧?
如果我想让参数b和char*变量a地址一样,那该咋办?

这种情况跟副本也不一样,C++中函数的传递类型有两种,分别是按值传递和按地址传递,只有按值传递时才会创建该对象的副本,此时修改该对象不会影响原值,而用引用和指针传递均属于按地址传递,此时修改该对象会影响原值,且不会再次调用构造函数来再次创建该对象,只会再多占用一个指针所占的内存大小(比如int*占4字节),用这种已经完全达到了目的,没有必要使参数b和char*变量a地址一样了。(或者也可以不传参,直接写全局变量,不过不推荐)
 楼主| Pammer 发表于 2020-4-20 06:30
聪明王子 发表于 2020-4-19 23:38
这种情况跟副本也不一样,C++中函数的传递类型有两种,分别是按值传递和按地址传递,只有按值传递时才会 ...

那么,如果我想在a函数改变b的值,就得加引用?
像这样,对吧。
[C++] 纯文本查看 复制代码
#include<iostream>
using namespace std;

void a(char*&);

int main()
{
	char* b = new char[2];
	b = (char*)"1";
	a(b);
	cout << b << endl;
	return 0;
}

void a(char*& b)
{
	b = (char*)"2";
	return;
}

tony666 发表于 2020-4-20 09:42
也可以用双重指针
[C++] 纯文本查看 复制代码
#include<iostream>
using namespace std;

void a(char** b)
{
    *b = (char*)"2";
    return;
}
int main()
{
    char* b = new char[2];
    b = (char*)"1";
    a(&b);
    cout << b << endl;
    return 0;
}


这样会不会稍微优雅一点
[C++] 纯文本查看 复制代码
#include<iostream>
using namespace std;

#define	PCHAR char*
void a(PCHAR* b)
{
    *b = (PCHAR)"2";
    return;
}

int main()
{
    PCHAR b = new char[2];
    b = (PCHAR)"1";
    a(&b);
    cout << b << endl;
    return 0;
}
 楼主| Pammer 发表于 2020-4-20 10:25
tony666 发表于 2020-4-20 09:42
也可以用双重指针
[mw_shl_code=cpp,true]#include
using namespace std;

问一下,这个地方为什么要用char**?指针这块还不是很懂
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 18:47

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表