-1

将指针保留在类内反映的主要更改中的最佳方法?

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();

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

4

3 回答 3

3

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

class X {

    unsigned char ** buffer;

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

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

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

X x(&buff);
于 2013-07-04T15:16:21.990 回答
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;在稍后阶段进行 - 这将更改buffto的值some_other_buffer,这可能不是您所期望的)。

于 2013-07-04T15:17:51.360 回答
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();
}
于 2013-07-04T15:19:15.397 回答