保持指针在类中反映的主要变化的最佳方法是什么?
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();
打印输出再打印你好世界???如何解决这个问题
答案 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();
}