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

时间:2014-10-22 09:29:15

标签: c memory-management struct char strcpy

我收到此错误消息:传递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 个答案:

答案 0 :(得分: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);
};