int p = (int *)malloc(sizeof(int));
和
int p = (int)malloc(sizeof(int));
任何人都可以向我解释内部发生的事情以及使用(int*)
和(int)
之间的区别吗?
感谢。
答案 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的情况。