大学数据结构的strassign函数c语言实现有个地方请教

问题遇到的现象和发生背景

问题在代码中用注释表明

问题相关代码,请勿粘贴截图
int strassign(Str& str, char* ch)
{
    if(str.ch)
        free(str.ch);  // 释放原串的空间,赋值的时候会重新给它分配相应的空间
    int len = 0;
    char *c = ch;      // 定义一个c指针用来指向要进行赋值的字符串
    while(*c) {        // 求ch串的长度
        ++len;
        ++c;
    }
    if(len == 0) {     // 如果ch为空串,则直接返回空串
        str.ch = NULL;
        str.length = 0;
        return 1;
    }
    else {
        str.ch = (char*)malloc(sizeof(char) * (len + 1));
        // 取len + 1是为了多分配一个空间存放“\0”字符
        if(str.ch == NULL)            // 就是这个地方,为什么分配了空间还会有等于NULL的情况呢?
            return 0;
        else {
            c = ch;
            for(int i = 0; i <= len; ++i, ++c)
                str.ch[i] = *c;
       /*注意:循环条件中之所以用“<=”,是为了将ch最后的‘\0’复制到新串中最为结束标记*/
            str.length = len;
            return 1;
        }
    }
}