C型铸造

时间:2013-04-30 21:36:40

标签: c++ c casting

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

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

任何人都可以向我解释内部发生的事情以及使用(int*)(int)之间的区别吗? 感谢。

5 个答案:

答案 0 :(得分:10)

你的两个例子都“糟糕”。

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

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

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

在“C ++”中,您不应使用malloc,而是使用new

答案 1 :(得分:6)

由于这是标记的C ++,我将把C ++角度转换为答案:

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

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

根据32位或64位arch,此代码将中断,因为您要将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;

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

std::unique_ptr<int> p(new int); // when p leaves scope, the memory is deleted

答案 2 :(得分:3)

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

的强制转换

它们本身就是完全不同的概念。有关指针以及如何/何时使用它们的更多信息,请参阅此tutorial。它们是C编程的基础(我认为将间接理解为概念非常重要,因为它总体上贯穿于编程中。)

答案 3 :(得分:3)

您正在分配指向int的指针 - 即int*,但您尝试将结果分配给int。这不起作用。

在C中,你不需要也不应该使用演员:

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

在C ++中,强制转换是必需的,但不建议使用(…)强制转换语法(称为“C-style强制转换”),就像使用malloc一样。所以句法上正确的C ++就是

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

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

答案 4 :(得分:2)

作业应该是:

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

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