不引用任何内容的指针的大小

Size of a pointer referring nothing

本文关键字:指针 引用 任何内      更新时间:2023-10-16

我的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的结果为例——(因为你可以进行指针运算)。如果需要,你需要自己管理。