Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c编程中的Malloc_C - Fatal编程技术网

c编程中的Malloc

c编程中的Malloc,c,C,我想知道这两条线有什么区别 char *ptr; ptr = malloc(10); 还有这个 char *ptr; ptr = (char *) malloc(10); 是否要强制转换malloc返回的内存?是的,在第二个示例中,您正在强制转换返回值。但是,你不应该这样做 有关详细信息,请访问此链接: 事实上,它们是等效的,但第二个更可取。此外,第一条记录将不会在C++中编译。因此,即使考虑到这个原因,最好还是使用第二条记录。从C++中获得最好的。< /P> 为什么第二个记录是可预测的。例

我想知道这两条线有什么区别

char *ptr;
ptr = malloc(10);
还有这个

char *ptr;
ptr = (char *) malloc(10);

是否要强制转换malloc返回的内存?

是的,在第二个示例中,您正在强制转换返回值。但是,你不应该这样做

有关详细信息,请访问此链接:

事实上,它们是等效的,但第二个更可取。此外,第一条记录将不会在C++中编译。因此,即使考虑到这个原因,最好还是使用第二条记录。从C++中获得最好的。< /P> 为什么第二个记录是可预测的。例如,您可以在下面的语句中说明分配了什么类型的内存吗

p = malloc( 10 * sizeof( *p ) );
这句话没有告诉代码的读者分配了什么类型的内存,他必须列出清单来找到p的定义,来说明分配了什么类型的内存。但是,即使他能找到变量p的定义,他也不能确定这个malloc语句是否正确,因为他不知道表达式的实际类型

malloc( 10 * sizeof( *p ) );
由于表达式的类型为void*,因此可以将其指定给任何类型的指针。这是某种错误的根源

例如,代码作者的意图可能是分配一个字符数组

( char * )malloc( 10 * sizeof( *p ) );
但如果你只想看,你就不能这样说

malloc( 10 * sizeof( *p ) );
但是您确定确实分配了一个字符数组吗?也许代码的作者的意思是

( char ( * )[2] )malloc( 10 * sizeof( *p ) );
甚至

( char ( * )[5] )malloc( 10 * sizeof( *p ) );
( short * )malloc( 10 * sizeof( *p ) );
甚至

( char ( * )[5] )malloc( 10 * sizeof( *p ) );
( short * )malloc( 10 * sizeof( *p ) );
等等

每个代码段都应该包含尽可能多的信息,以便在没有任何注释的情况下清楚地了解编写代码段的目的

当编译器没有像现在这样聪明时,他们没有报告代码中是否定义了函数malloc,也就是是否包含了相应的头。在这种情况下,默认情况下编译器认为函数的返回类型为int。如果不使用强制转换,编译器可能会报告错误。
但现在这种把戏毫无意义。如果未声明函数,编译器将报告。尽可能使代码更可读、更清晰。

是的,malloc返回一个void*,但是通常不建议强制转换,因为如果不强制转换,编译器会警告错误。是的,第二个示例正在强制转换结果。无需强制转换为C,感谢您的链接!但是出于好奇,这两条线做了相同的事情,对吗?是的,它们做了相同的事情。如果你想用C++编译器编译你的代码,你需要将其编译。“AN非常愚蠢的答案(引用)是一个没有自己大脑的低质量程序员,而不是因为C的右边表达式的类型是空的而使用了铸造。永远不要听从这些没有头脑的白痴的建议。请问这句话是什么意思?(char(*)[2])malloc(10*sizeof(*p))@Patrick一个好的等式!它确认您应该始终使用casting来了解分配的内存类型。此记录表示分配了一个具有两列的二维数组。