我的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;
}
}
答案 0 :(得分:4)
不,您不能使用sizeof
来确定指针是否指向某个东西。 sizeof
指针在同一架构中的大小始终相同。
你可以这样做:
Tool::Book* books = NULL;
并且,如果要检查它是否指向有效的非空值,只需执行:
if (Tool::books) {
// books is pointing to something
}
每当为指针(数组)分配内存时,如果分配成功,则指针将不再为null。由于您使用的是C++
,因此请考虑使用std::vector
来保存动态维度数组而不是数组(指针)。
答案 1 :(得分:1)
与C类似,C ++是静态类型的 - sizeof
运算符返回的各种类型大小在编译时确定,不会更改。
执行所要求的正确方法是初始化指向NULL
的指针并在之后检查。保证NULL
不会引用任何有效的内存地址,这使得它成为不存在的指针目标的良好标记。无论如何,初始化你的指针是一个很好的做法 - 它可以避免解除引用未初始化指针的潜在问题,这些问题最多会导致令人讨厌的内存错误。
是的,显式初始化其余变量也是一个好主意......
修改强>
一个不那么细微的细节:C和C ++程序中的静态字段存储在可执行文件的特殊部分(例如BSS)中,并在程序加载时自动初始化为零。因此,您不需要显式初始化到NULL
的静态指针;已经为你做过......
答案 2 :(得分:1)
理解指针比使用sizeof
更能解决问题。
sizeof
是编译时操作。对于指针,它总是返回sizeof(void*)
(在大多数64位架构上为8字节)。除VLA以外,sizeof
返回编译时常量。
C不知道任何指向区域的使用大小 - 以malloc
的结果作为示例 - (因为你可以做指针算术)。如果需要,您需要自己管理它。