带有指针参数的函数内给指针参数赋值时注意事项

来源:互联网 发布:笔记本硬盘的数据导出 编辑:程序博客网 时间:2024/05/16 13:45
在career cup上看到这样一题
http://www.careercup.com/questionthread?id=43963

#include "stdafx.h"
#include <iostream>
using namespace std;
void newBuffer(char* outBuffer, size_t sz)
{
    outBuffer = new char[sz];
}
int _tmain(int argc, _TCHAR* argv[])
{
    const char* kung = "KUNG";
    char* foo;
    size_t len = strlen(kung);
    newBuffer(foo, len+1);
    memset(foo, 0, len+1);
    strncpy(foo, kung, len);
    cout << foo << endl;
    return 0;
}

这个程序看起来好像在做这样一件事:定义一个指针foo,然后在newBuffer函数中给指针foo分配内存,然后把kung中的内容拷贝到foo中。

注意!这里在newBuffer中,new只是给指针outBuffer分配了内存,而并没有给指针foo分配!这里newBuffer函数只是简单的把指针foo的值赋给了局部指针变量outBuffer!所以foo最后根本没有初始化,也没有指向任何内存!

正确的做法是将
void newBuffer(char* outBuffer, size_t sz)
{
    outBuffer = new char[sz];
}
改为
void newBuffer(char* &outBuffer, size_t sz)
{
    outBuffer = new char[sz];
}

这里outBuffer变成了一个引用,任何对outBuffer的更改等同于对foo的更改。


转自:http://blog.sina.com.cn/s/blog_6e0693f70100slj5.html