首页 文章

为char分配额外的内存,但不为已分配的struct中的int分配内存?

提问于
浏览
0

我收到此错误消息:传递x的参数1从指针生成整数而没有强制转换 . 在传递int时,我以相同的方式完成了exaclty,并且完美无缺 . 但当我用一个char做到这一点时,我得到了这个错误 . 码:

struct x {
    char y;
}

struct x *make(char y)
{
    struct x *n = malloc(sizeof(struct x));
    n->y = y; 
    return n;
};

int main(void)
{
    make("y");
    return 0;
}

我修改了错误,将char更改为char *并使用strcpy . 所以它完美地运作 . 但我不明白为什么我必须这样做 . 我用malloc(sizeof(struct x))为整个结构分配内存?那么为什么我必须为char分配额外的内存 . 这看起来很奇怪 . 我可能误会了吗?那么为什么会这样呢 .

1 回答

  • 4
    "y"
    

    是一个字符串文字 . 这是一个指向以null结尾的字符数组的指针 .

    您的函数接收单个字符,因此您需要传递一个字符文字:

    'y'
    

    为了调用函数 make 来编译 .


    您在最后一段中描述的更改完全改变了结构 . 它将成员从单个字符(内联分配)更改为指向以null结尾的字符数组的指针 . 而后一种变体需要为字符数组单独分配 . 这可能是你想要做的,只有你知道 . 但是你必须理解单个字符和指向以null结尾的字符数组的指针之间的区别 .

    因此,请考虑问题中结构的版本:

    struct x {
        char y;
    }
    

    您动态分配了一个结构,如下所示:

    struct x *n = malloc(sizeof(struct x));
    

    此时你已经完成了 . 结构的所有成员都由此单个调用分配 .

    您在问题中讨论的结构的备用版本如下所示:

    struct x {
        char *y;
    }
    

    你会再次像这样分配结构:

    struct x *n = malloc(sizeof(struct x));
    

    再次,这将分配结构的所有成员 . 所以指针 n->y 被分配了 . 但缺少的一步是 n->y 尚未初始化 . 通常,这将涉及到 malloc 的进一步调用 . 这样做的功能可能如下所示:

    struct x *AllocStruct(const char *y)
    {
        struct x *s = malloc(sizeof *s);
        s->y = malloc(strlen(y) + 1);
        strcpy(s->y, y);
        return s;
    };
    

    然后释放结构你会这样做:

    void FreeStruct(const struct x *s)
    {
        free(s->y);
        free(s);
    };
    

相关问题