在这个问题,有人建议意见,我应该不会投的结果malloc,即
int *sieve = malloc(sizeof(int) * length);
Run Code Online (Sandbox Code Playgroud)
而不是:
int *sieve = (int *) malloc(sizeof(int) * length);
Run Code Online (Sandbox Code Playgroud)
为什么会这样呢?
我正在研究一个旧的代码库,几乎每次调用free()都会在其参数上使用强制转换.例如,
free((float *)velocity);
free((float *)acceleration);
free((char *)label);
Run Code Online (Sandbox Code Playgroud)
其中每个指针都是相应的(和匹配的)类型.我完全没有理由这样做.这是非常古老的代码,所以我想知道它是否是K&R的东西.如果是这样,我实际上希望支持可能需要这个的旧编译器,所以我不想删除它们.
使用这些演员阵容有技术原因吗?我甚至没有看到使用它们的实用理由.在释放数据类型之前提醒自己有什么意义?
编辑:这个问题不是另一个问题的重复.另一个问题是这个问题的一个特例,如果亲密的选民能够阅读所有的答案,我认为这是显而易见的.
Colophon:我给出了"常量答案"的核对标记,因为这可能是为什么需要这样做的真正原因; 然而,关于它是一个ANSI C之前的习惯(至少在一些程序员中)的答案似乎是它在我的情况下使用的原因.很多人在这里有很多好处.感谢您的贡献.
我在旧的C代码中看到了很多以下内容:
type_t *x = (type_t *) malloc(...);
Run Code Online (Sandbox Code Playgroud)
从那里malloc()开始返回指针的重点是什么void *?是因为较旧的C编译器不支持void指针而是malloc()习惯返回char *?
这个赋值要求我们使用malloc()(命名var1和var2)分配两个int类型变量,打印每个变量的地址(堆栈上指针的地址和堆上的地址),然后free()用来解除分配var1,再次打印地址,然后在堆中分配另一个空间var1并第三次打印地址.我相信教师试图告诉我们堆地址var1应该改变,但它始终保持不变......除非我free(var1)从代码中删除.教练做了类似的演示,但没有free()用来解除分配任何变量,所以我们从来没有看到它应该如何工作.
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
void main()
{
int *var1 = (int*)malloc(sizeof(int));
*var1 = 1000;
int *var2 = (int*)malloc(sizeof(int));
*var2 = 2000;
printf("Addresses of var1\n");
printf("Pointer on stack: %p / Heap: %p\n\n", &var1, var1);
printf("Addresses of var2\n");
printf("Pointer on stack: %p / Heap: %p\n\n", &var2, var2);
free(var1);
printf("AFTER DEALLOCATING var1 FROM THE HEAP\n");
printf("Addresses of var1\n");
printf("Pointer on stack: %p / …Run Code Online (Sandbox Code Playgroud) 我正在检查不需要显式地转换malloc调用结果的代码,但每当我尝试这样做时,编译器都会抛出错误.
即
char *somevar;
somevar = malloc(sizeof(char) * n); //error
somevar = (char *)malloc(sizeof(char) * n); // ok
Run Code Online (Sandbox Code Playgroud)