int p = (int *)malloc(sizeof(int));
和,
int p = (int)malloc(sizeof(int));
谁能解释一下内部发生了什么以及使用(int*)
and之间的区别(int)
?谢谢。
你的两个例子都是“坏的”。
第一个是不正确的,因为它试图分配一个指向整数的指针,因此至少应该给出一个警告,更有可能是一个错误。如果机器是 64 位的,而您正在将其编译为 64 位代码,则指针可能不适合整数 [这同样适用于 32 位机器上的 16 位 int,但现在这并不常见]。
第二个例子很可能会编译,但它仍然用指针的值分配一个整数,这几乎没有意义(它可能不适合,因为指针大于int
)。
在“C”中,您不应该使用强制转换来分配返回的值malloc
- 这是错误的,并且可能导致问题。
在“C++”中,你不应该使用malloc
,new
而是使用。
由于这是标记为 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
(int *)
是对指向整数的指针的强制转换
(int)
是对整数的强制转换
它们本身就是完全不同的概念。有关指针以及如何/何时使用它们的更多信息,请参阅本教程。它们是 C 编程的基础(我认为理解间接作为一个概念很重要,因为它普遍存在于编程中)。
您正在分配一个指向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
作业应该是:
int * p = (int *)malloc(sizeof(int));
malloc 返回 void *(总是一个指针),然后您希望将其转换为适当的指针类型,例如 int *。使用完分配的内存后,释放()分配的内存也很重要,以防止内存泄漏。我假设您的示例是学术性的,因为在少数情况下您希望/需要在堆上分配一个 int 。