[C++]指针做参数的bug,双指针的应用

指针作为参数,可以修改指针指向对像的值,这个外面的也会被修改。修改指针的指向,外面的指针并不会被修改,需要用到指向指针的指针。

#include<iostream>
#include <vector>
using namespace std;
/*
void getMemory(char *p,int num)
{
	p = (char*)malloc(num);
}
*/

void getMemory(char **p,int num)
{
	*p = (char*)malloc(num);
}

int main() {
	char *p =NULL;
	int num = 100;
	getMemory(&p, num);
	//getMemory(p, num);
	char * test = "test";
	strcpy(p, test);
	printf("%s \n", p);
	free(p);
	system("pause");
	return 0;
}
#include<stdio.h>
 
int main()
{
    int a, *p1, **p2;
    a=65;
    p1=&a;
    p2=&p1;
 
    printf("a = %d\n", a);
    printf("address of a = %d\n", &a);
    printf("p1 = %d\n", p1);
    printf("address p1 = %d\n", &p1);
    printf("*p1 = %d\n", *p1);
    printf("p2 = %d\n", p2);
    printf("*p2 = %d\n", *p2);
    printf("**p2 = %d\n", **p2);
 
    return 0;
}

应用场景,很多相同的代码,我需要把相同的代码抽成一个函数,抽成的函数需要返回2个指针,当然你也可以选择返回结构体。

主动调用的地方

ENHandlerResult CRequestEnterTable::ProcessUpdateSucc(CHandlerTokenBasic* ptoken, CSession* psession)
{
    PBDSSGameTable *pPBDSSGameTable = NULL ; PBDSSTableSeat *pseat = NULL;
    if(!Clienthandlerbase::Instance()->cs_response_dss_enter_table(psession, &pPBDSSGameTable, &pseat, EN_Position_MJ_XZ))
        return EN_Handler_Done;
    CPBGameTable* ptable = (CPBGameTable*)pPBDSSGameTable;
    TableManager::Instance()->OnPlayerEnterTable(psession->_request_route.uid(), ptable->tid());
    ptable->StopReadyTimer();
    ptable->StartReadyTimer(120);
    return EN_Handler_Done;
}

被动调用的地方

bool Clienthandlerbase::cs_response_dss_enter_table(CSession* psession, PBDSSGameTable** ptable, PBDSSTableSeat** pseat, ENPlayerPositionType gameId)
{
    if (psession->_fsm_state == EN_EnterTable_State_ULOCK)
    {
        PBCSMsg msg;
        CSResponseDssEnterTable& response = *msg.mutable_cs_response_dss_enter_table();
        response.set_result(EN_MESSAGE_TABLE_NOT_EXIST);
        Message::SendResponseMsg(RouteManager::Instance()->GetRouteByRandom(), psession, msg);
        return false;
    }
    else if (psession->_fsm_state == EN_EnterTable_State_ULOCK_AF_SAVE)
    {
        PBCSMsg msg;
        CSResponseEnterTable& response = *msg.mutable_cs_response_enter_table();
        response.set_result(EN_MESSAGE_NO_EMPTY_SEAT);
        Message::SendResponseMsg(RouteManager::Instance()->GetRouteByRandom(), psession, msg);
        return false;
    }
    const CSRequestDssEnterTable& cs_request_enter_table = psession->_request_msg.cs_request_dss_enter_table();
    int tid = cs_request_enter_table.tid();
    *ptable = TableMgrbase::Instance()->FindTable(tid);
    if(NULL == ptable)
        return false;
    *pseat = TableMgrbase::Instance()->FindEmptySeatInTable(**ptable, cs_request_enter_table.observe());
    if(NULL == pseat)
    {
        psession->_fsm_state = EN_EnterTable_State_ULOCK_AF_SAVE;
        PBUpdateData update;
        update.set_key(PBUserDataField::kUserInfo);
        {
            PBDBAtomicField& field = *update.add_field_list();
            field.set_field(EN_DB_Field_POS);
            PBBPlayerPositionInfo& pos = *field.mutable_pos();
            pos.set_pos_type(EN_Position_Hall);
            pos.set_table_id(0);
            pos.set_gamesvrd_id(0);
        }
        psession->NewAddUpdateData(psession->_request_route.uid(), update);
        return false;
    }

    long long uid = psession->_request_route.uid();
	//竞技场,记录玩家来自哪个亲友圈
    if((**ptable).config().is_arena())
    {
        (**pseat).mutable_src_tea_bar()->set_tbid(cs_request_enter_table.src_tbid());
        (**pseat).mutable_src_tea_bar()->mutable_tb_master()->set_uid(cs_request_enter_table.src_tb_master_uid());
    }

    const PBUser& user = psession->_kvdb_uid_data_map[uid].user_info();
    int connect_id = cs_request_enter_table.connect_id();
    const PBUserTeaBarData& tbdata = psession->_kvdb_uid_data_map[uid].user_tea_bar_data();
    TableMgrbase::Instance()->SitDownOnTable(**ptable,**pseat,user,tbdata,connect_id);

    PBCSMsg msg;
    CSResponseDssEnterTable& response = *msg.mutable_cs_response_dss_enter_table();
    CSNotifyTableInfo& info = *response.mutable_table_info();
    TableMgrbase::Instance()->CopyTableToNotify(**ptable, info, uid);
    response.set_result(EN_MESSAGE_ERROR_OK);
    response.set_gamesvrd_id(TGlobal::_svid);
    response.set_pos_type(gameId);
    Message::SendResponseMsg(RouteManager::Instance()->GetRouteByRandom(), psession, msg);

    return true;
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值