免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5008 | 回复: 11
打印 上一主题 下一主题

求助: 结构指针做函数入参 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-15 22:51 |只看该作者 |倒序浏览
本来想用结构指针获取某处已经分配了内存的块数据.
结果发现返回的指针为空, 百思不得其解, 特求助.

程序如下:
typedef struct Blk
{
    int aa;
    int dd;
}BLOCK, *pBLOCK;

pBLOCK blk = (pBLOCK)malloc(sizeof(BLOCK));

int test(BLOCK *out)
{
    out = blk;
    printf("\n source pointer %p", out);
    printf("\n 0x%x", out->aa);
    printf("\n 0x%x", out->dd);
    return 0;
}

// 唯一的应用程序对象

CWinApp theApp;

using namespace std;



int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
        int nRetCode = 0;

        // 初始化 MFC 并在失败时显示错误
        if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
        {
                // TODO: 更改错误代码以符合您的需要
                _tprintf(_T("错误: MFC 初始化失败\n"));
                nRetCode = 1;
        }

    blk->aa =0x1234;
    //blk->bb = L"first";
    //blk->cc = new CString(L"second");

    blk->dd = 0x4321;

    pBLOCK out=NULL;

    test(out);

    printf("\n when out, pointer:%p", out);
    printf("\n gloabl pointer:%p", blk);
   

        return nRetCode;
}



运行结果:

source pointer 003AF8B8
0x1234
0x4321
when out, pointer:00000000
gloabl pointer:003AF8B8请按任意键继续. . .

论坛徽章:
0
2 [报告]
发表于 2009-08-15 23:27 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2009-08-15 23:28 |只看该作者
原帖由 lurker0 于 2009-8-15 22:51 发表
本来想用结构指针获取某处已经分配了内存的块数据.
结果发现返回的指针为空, 百思不得其解, 特求助.

程序如下:typedef struct Blk
{
    int aa;
    int dd;
}BLOCK, *pBLOCK;

pBLOCK blk = (pBLOC ...



out 是传值的,还是原来的NULL,这个输出结果不是意料中的事吗?

论坛徽章:
0
4 [报告]
发表于 2009-08-16 08:06 |只看该作者
原帖由 lurker0 于 2009-8-15 22:51 发表
本来想用结构指针获取某处已经分配了内存的块数据.
结果发现返回的指针为空, 百思不得其解, 特求助.

程序如下:typedef struct Blk
{
    int aa;
    int dd;
}BLOCK, *pBLOCK;

pBLOCK blk = (pBLOC ...

传out的地址

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
5 [报告]
发表于 2009-08-16 15:01 |只看该作者
指针的指针也可以

论坛徽章:
0
6 [报告]
发表于 2009-08-16 15:31 |只看该作者
惭愧啊  一时脑筋转不过弯了  的确是基本功问题
如上面所说
指针的指针可以解决这个问题  引用也可以
int test(BLOCK * & out)

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
7 [报告]
发表于 2009-08-17 15:40 |只看该作者
原帖由 jamesr 于 2009-8-15 23:27 发表


指针的基础不扎实:要改参数的值只有一种方法——把改完的值作为返回值返回。
看看下面的例子:

#include
struct A{
  int a;
};

void swap(struct A *a, struct A *b)
{
  struct A *t=b;
  ...

int test(BLOCK **out)
{
    *out = blk;
    printf("\n source pointer %p", *out);
    printf("\n 0x%x", (*out)->aa);
    printf("\n 0x%x", (*out)->dd);
    return 0;
}


...

test(&out);

因为你要传一个地址出来,所以要给一个指针的地址,就是 **out。

[ 本帖最后由 yulihua49 于 2009-8-17 15:43 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-09-02 16:38 |只看该作者
学习了!!!

论坛徽章:
0
9 [报告]
发表于 2009-09-02 16:59 |只看该作者
pBLOCK blk = (pBLOCK)malloc(sizeof(BLOCK));
这句是做何讲?
全局变量赋值?!

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
10 [报告]
发表于 2009-09-02 19:58 |只看该作者
原帖由 CMAX 于 2009-9-2 16:59 发表
pBLOCK blk = (pBLOCK)malloc(sizeof(BLOCK));
这句是做何讲?
全局变量赋值?!

分配内存。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP