任何人都可以解释两个分配之间的差异以及为什么坏和好?在每个坏事和好事的情况下会发生什么?
错误的分配
void get_memory(char *arr, int length){
if((arr=(char*)malloc(length * sizeof(char))) == NULL)
{
puts("Not enough memory. Sorry.\n");
exit(-1);
}
}
void main(void){
char *str = NULL;
get_memory(str, 128);
strcpy(str,"Program illegally runs over memory !\n");
puts(str);
free(str);
}
良好的分配
void get_memory(char **arr, int length){
if( (*arr = (char*)malloc(length * sizeof(char))) ==
NULL)
{
puts("Not enough memory. Sorry.\n");
exit(-1);
}
}
void main(void){
char *str = NULL;
get_memory(&str, 128);
strcpy(str, "This program works fine !\n");
puts(str);
free(str);
}
答案 0 :(得分:3)
不好的是,在第一种情况下,指针 arr
通过值传递,它的值在函数中被修改,并且当返回值时,“忘记”。在第二个代码中,传递了指针的引用,因此当不在函数中时,保留赋值。
答案 1 :(得分:0)
在“坏”示例中,您实际上丢弃了malloc的结果,因为“str”参数是passe dby值并且在调用后将保留其NULL值。在第二种情况下,函数接收POINTER TO“str”,因此它能够操纵“str”并在其中保留正确的值。
答案 2 :(得分:0)
正如其他人已经回答了您的问题,我添加了另一种选择:
void get_memory(char **arr, size_t length){
if((*arr = malloc(length)) == NULL && 0 != length)
{
puts("Not enough memory. Sorry.\n");
exit(-1);
}
}
推理:length
不应为否定。如果是0
,则malloc
的结果可以是NULL
。
malloc
返回void*
,它会自动转换为C中适当的指针类型。
根据后来的C标准,sizeof(char)
为1。