3

考虑这段代码:

int *p = new int;
cout << sizeof(*p);
delete p;

正如预期的那样,结果是 4。现在,考虑这个其他代码:

int *p = new int[10];
cout << sizeof(*p);
delete[] p;

我希望得到 40 (分配数组的大小),但结果仍然是 4

现在,假设我有一个函数int *foo(),它返回指向使用new或使用创建的结构的指针new[](但我不知道是哪一个):

int *p = foo();

我的问题是,有没有办法(或破解)知道是p指向单个整数还是整数数组?

请记住,这只是一个理论问题。我不会以这种方式编写真正的代码。

4

7 回答 7

4

不,没有办法做到这一点。但是知道区别,因为您编写的代码称为newor new[]

顺便说一下原因:

 cout << sizeof(*p);

在这两种情况下都给你 4 是因为 p 是一个指向 int 的指针,表达式 *p 表示这样一个指针(即一个 int)指向的东西,并且你平台上一个 int 的大小是 4。这都是评估的在编译时,所以即使new[]返回一个特殊的值,sizeof也无法使用它。

于 2011-06-03T15:44:01.727 回答
3

不,因为你的结果是一个地址(这就是为什么你在这两种情况下都得到 4 的 sizeof() )。你创造了它,所以你应该知道它是什么。

于 2011-06-03T15:47:00.217 回答
2

在这两个示例中,p 的类型相同:int *。sizeof 对类型而不是数据进行操作。它是在编译时计算的。

你有几个选择。您可以自己跟踪数组大小,也可以冒险使用标准库中的容器之一,例如 vector<int>。这些容器将为您跟踪大小(例如vector< int >::size())。

于 2011-06-03T15:47:48.897 回答
2

sizeof(x) 返回包含声明的 x 所需的内存量。

这根本没有动态方面。

foo 为 a 的 sizeof (*foo)bar *将始终与sizeof(bar)

于 2011-06-03T15:48:35.220 回答
1

不,没有办法。

强制性问题:你为什么需要知道?

如果它是“因为我需要知道是说delete []还是delete”,那么就一直使用数组,如果由于某种晦涩的原因你无法弄清楚你在自己的代码中使用了哪个数组。

于 2011-06-03T15:44:05.737 回答
1

拥有一个可以返回指向单个项目或数组的指针的函数是一个糟糕的设计决策。您始终可以返回一个指向大小为 1 的数组的指针:

return new int[1];
于 2011-06-03T15:48:33.567 回答
0

首先,sizeof(*p)总是返回一个整数值,所以它总是返回4

现在,你怎么知道p是指向int还是int[]

没有标准的方法。但是,您可以破解该平台并使其广为人知。例如,如果您尝试打印p[-1], p[-2], ..., p[-4] etc.某些编译器(在我的例子中是 linux),那么您将在此位置的值中看到特定模式。但是,这只是一个 hack,你不能总是依赖它。

于 2011-06-03T16:54:28.560 回答