任何人都可以解释两个分配之间的差异,为什么坏和好?

时间:2015-02-13 21:31:49

标签: c memory

任何人都可以解释两个分配之间的差异以及为什么坏和好?在每个坏事和好事的情况下会发生什么?

错误的分配

  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);
}

3 个答案:

答案 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。