我的sizeof()有问题。我在以前创建的类中有一个指针。这个指针被初始化为
static Book* books;
所以它没有任何意义。我想确定指针是否指向任何数组。所以第一个问题是,有什么解决方案可以做到这一点,因为我可以在运行时更改这个指针的地址来指向数组。我尝试使用sizeof(指针),但它对我的帮助不够。返回的是数字4。我可以用这种方式来评估它是否引用了什么。
这是我的课:
class Tool
{
private:
static Book* books;
public:
static char* pgetStringIntoArray(string);
static string* pgetStringFromArray(char*);
static void printCharArray(char*);
static bool* addBook(Book*);
static bool* isStored(Book*);
};
这是一个有问题的方法:
bool* Tool::isStored(Book* book)
{
bool* stored = new bool(false);
if(Tool::books)
{
cout << "NULL" << endl;
} else {
return stored;
}
}
否,不能使用sizeof
来确定指针是否指向某个东西。CCD_ 2指针在相同的体系结构中将总是相同的大小。
你可以这样做:
Tool::Book* books = NULL;
而且,如果你想检查它是否指向一个有效的非null值,只需执行:
if (Tool::books) {
// books is pointing to something
}
每当您为指针(数组)分配内存时,如果分配成功,指针将不再为null。由于您使用的是C++
,请考虑使用std::vector
来保存动态维度的数组,而不是数组(指针)。
与C非常相似,C++是静态类型化的——sizeof
运算符返回的各种类型大小在编译时确定,不会更改。
正确的方法是初始化指向NULL
的指针,然后进行检查。NULL
保证不引用任何有效的内存地址,这使它成为不存在的指针目标的良好标记。无论如何,初始化指针是一种很好的做法——它可以避免由于取消引用未初始化的指针而产生的潜在问题,这些问题最多会导致严重的内存错误。
是的,显式初始化其余变量也是个好主意。。。
编辑:
一个不那么小的细节:C和C++程序中的静态字段存储在可执行文件的一个特殊部分(例如BSS)中,并在程序加载时自动初始化为零。因此,您不需要显式初始化指向NULL
的静态指针;已经为你做了。。。
您的问题更多的是理解指针,而不是sizeof
。
sizeof
是编译时操作。对于指针,它总是返回sizeof(void*)
(在大多数64位体系结构上是8个字节)。除了VLA,sizeof
返回一个编译时常数。
C不知道所使用的任何指向区域的大小——以malloc
的结果为例——(因为你可以进行指针运算)。如果需要,你需要自己管理。