继续在内部更改指针

时间:2013-07-04 15:08:07

标签: c++ pointers

保持指针在类中反映的主要变化的最佳方法是什么?

static unsigned char tmp[][20] = {"hello world", "bye world"};

class X {       
    unsigned char ** buffer;

public:
    X(unsigned char* buff)
    {
        buffer = &buff;
    }

    void printThis()
    {
        DBG_MSG_FORMATED(".......> %s", *buffer);
    }
};


int main (int argc, char * const argv[]) {
    unsigned char * buff = new unsigned char[20];
    memcpy(buff, tmp[0], 12);
    X x(buff);
    x.printThis();
    memcpy(buff, tmp[1], 12);
    x.printThis();
    delete [] buff;

    return EXIT_SUCCESS;
}

这有效,但是当我按照

进行操作时
buff = tmp[0];
x.printThis();

打印输出再打印你好世界???如何解决这个问题

3 个答案:

答案 0 :(得分:3)

您需要在类中使用指向指针的指针( gulp !):

class X {

    unsigned char ** buffer;

public:
    X(unsigned char** buff)
    {
        buffer = buff;
    }

    void printThis()
    {
        DBG_MSG_FORMATED(".......> %s", *buffer);
    }
};

然后在构造期间传入指针的地址:

X x(&buff);

答案 1 :(得分:1)

int main (int argc, char * const argv[]) {
    unsigned char * buff = new unsigned char[20];
    memcpy(buff, tmp[0], 12);
    X x(buff);
    x.printThis();
    delete [] buff;

    buff = tmp[1];  
    x.printThis();

    return EXIT_SUCCESS;
}

完成delete buff;后,类中的指针buffer指向已删除的内存,这是非常坏的消息。

如果您要存储buff的实际地址,则需要传递buff的地址并存储,如下所示:

char **buffer;
X(unsigned char** buff)
{
    buffer = buff;
}

void printThis()
{
    DBG_MSG_FORMATED(".......> %s", *buffer);
}

...     X x(& buff);

或者您可以buffer引用buff

char*& buffer;
X(unsigned char*& buff) : buffer(buff) {}

(课程或其他代码无需进行其他更改 - 但请注意,您稍后无法buffer = some_other_buffer; - 这会将buff的值更改为{{1} },这可能不是你所期望的。)

答案 2 :(得分:1)

你可以做一些事情如下(使用指向指针的指针),但从某种程度上说,这比解决方案更成问题,因为你无法在不小心使用类X中的指针的情况下删除tmp

#include <cstdio>
#include <cstring>

static unsigned char tmp[][20] = {"hello world", "bye world"};

class X {

unsigned char ** buffer;

public:
    X(unsigned char** buff)
    {
        buffer = buff;
    }

    void printThis()
    {
        printf(".......> %s", *buffer);
    }
};


int main (int argc, char * const argv[]) {
    unsigned char * buff = new unsigned char[20];
    memcpy(buff, tmp[0], 12);
    X x(&buff);
    x.printThis();

    buff = NULL;
    buff = tmp[1];
    x.printThis();
}