0

我对 sizeof() 有疑问。我在之前创建的类中有一个指针。并且这个指针被初始化为

 static Book* books;

所以它确实没有任何意义。我想确定指针是否指向任何数组。所以第一个问题是,有什么解决方案可以做到这一点,因为我可以在运行时更改这个指针的地址以指向一个数组。我尝试使用 sizeof(pointer) 但它对我的帮助不够。返回是数字 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;
    }

}
4

3 回答 3

4

不,您不能sizeof用来确定指针是否指向某物。sizeof在同一架构中,指针将始终具有相同的大小。

你可以这样做:

Tool::Book* books = NULL;

而且,如果您想检查它是否指向有效的非空值,只需执行以下操作:

if (Tool::books) {
    // books is pointing to something
}

每当您为指针(数组)分配内存时,如果分配成功,则指针将不再为空。由于您使用的是C++,请考虑使用std::vector来保存动态维度的数组而不是数组(指针)。

于 2012-08-25T16:24:16.580 回答
1

您的问题更多的是理解指针而不是sizeof.

sizeof编译时操作。对于指针,它总是返回sizeof(void*) (在大多数 64 位架构上是 8 个字节)。除了VLA s,sizeof返回一个编译时间常数。

C 不知道任何指向区域的使用大小 - 以结果malloc为例 - (因为您可以进行指针运算)。如果需要,您需要自己管理它。

于 2012-08-25T17:25:10.683 回答
1

与 C 非常相似,C++ 是静态类型的 - 运算符返回的各种类型大小sizeof在编译时确定并且不会更改。

做你所要求的正确方法是初始化你的指针NULL并在之后检查它。NULL保证不引用任何有效的内存地址,这使其成为不存在的指针目标的良好标记。无论如何,初始化您的指针是一个很好的做法——它使您免于取消引用未初始化指针的潜在问题,这些问题充其量会导致严重的内存错误。

是的,显式初始化其余变量也是一个好主意......

编辑:

一个不那么次要的细节:C 和 C++ 程序中的静态字段存储在可执行文件的特殊部分(例如BSS)中,并在程序加载时自动初始化为零。因此,您不需要显式初始化指向NULL;的静态指针。这已经为你完成了......

于 2012-08-25T16:27:14.960 回答