没有引用指针的大小

时间:2012-08-25 16:22:31

标签: c++ arrays pointers sizeof

我的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;
    }

}

3 个答案:

答案 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的结果作为示例 - (因为你可以做指针算术)。如果需要,您需要自己管理它。