2
int p = (int *)malloc(sizeof(int));

和,

int p = (int)malloc(sizeof(int));

谁能解释一下内部发生了什么以及使用(int*)and之间的区别(int)?谢谢。

4

5 回答 5

10

你的两个例子都是“坏的”。

第一个是不正确的,因为它试图分配一个指向整数的指针,因此至少应该给出一个警告,更有可能是一个错误。如果机器是 64 位的,而您正在将其编译为 64 位代码,则指针可能不适合整数 [这同样适用于 32 位机器上的 16 位 int,但现在这并不常见]。

第二个例子很可能会编译,但它仍然用指针的值分配一个整数,这几乎没有意义(它可能不适合,因为指针大于int)。

在“C”中,您不应该使用强制转换来分配返回的值malloc- 这是错误的,并且可能导致问题。

在“C++”中,你不应该使用malloc,new而是使用。

于 2013-04-30T21:42:32.550 回答
6

由于这是标记为 C++,我将从 C++ 角度来回答:

int p = (int *)malloc(sizeof(int));
int p = (int)malloc(sizeof(int));

这两个都是错误的,malloc 返回一个指向某个内存的指针。我认为您真正想要的是在堆上分配一个 int,因此您的返回值是 int*。

根据 32 位或 64 位架构,此代码将中断,因为您要将 64 位数据分配给 32 位存储。

C中的正确方法是:

int* p = malloc(sizeof(int));

也就是说,为 int 类型分配足够的空间,并存储指向该分配空间的指针。在 C 中不需要强制转换。

在 C++ 中,如果你使用 malloc,它看起来像这样:

int* p = static_cast<int*>(malloc(sizeof(int)));

现在需要强制转换,但是您可以通过使用 operator new 来避免这种情况:

int* p = new int; // much cleaner!

注意 operator new 将在失败时抛出 std::bad_alloc 而不是返回 nullptr/0/NULL。

如果您不希望它抛出但想要更清晰的语法,您可以使用:

int* p = new (std::nothrow) int;

或者更好的是,除非真的需要,否则不要在堆上分配,或者使用智能指针,这样您就不必担心调用运算符 delete 或 free():

std::unique_ptr<int> p(new int); // when p leaves scope, the memory is deleted
于 2013-04-30T21:52:00.977 回答
3

(int *)是对指向整数的指针的强制转换
(int)是对整数的强制转换

它们本身就是完全不同的概念。有关指针以及如何/何时使用它们的更多信息,请参阅本教程。它们是 C 编程的基础(我认为理解间接作为一个概念很重要,因为它普遍存在于编程中)。

于 2013-04-30T21:40:12.430 回答
3

您正在分配一个指向int- 即int*,您正在尝试将结果分配给int. 那是行不通的。

在 C 中,您不需要也不应该使用强制转换:

int *pi = malloc(sizeof(int));

在 C++ 中,强制转换是必需的,但(…)不鼓励使用强制转换语法(称为“C 风格的强制转换”),就像使用. 一样malloc。所以语法正确的 C++ 将是

int* pi = static_cast<int*>(malloc(sizeof(int)));

然而,好的代码要么是(a)完全避免指针分配,(b)使用现成的类来处理分配,例如boost::optional<int>,或者作为最后的手段,使用智能指针(例如std::unique_ptr<int>)。如果出于深不可测的原因,您实际上想要在 C++ 中手动分配和处理内存,请使用new运算符或分配器类(例如std::allocator)。malloc仅当您将内存传递给 C API 时才在 C++ 代码中使用,该 C API明确要求您通过malloc. 这是C++ 中唯一有效的用法。malloc

于 2013-04-30T21:44:10.657 回答
2

作业应该是:

int * p = (int *)malloc(sizeof(int));

malloc 返回 void *(总是一个指针),然后您希望将其转换为适当的指针类型,例如 int *。使用完分配的内存后,释放()分配的内存也很重要,以防止内存泄漏。我假设您的示例是学术性的,因为在少数情况下您希望/需要在堆上分配一个 int 。

于 2013-04-30T21:38:15.423 回答