【问题标题】:allocate extra memory for a char but not for an int in an already allocated struct?为 char 分配额外内存,但不为已分配结构中的 int 分配额外内存?
【发布时间】:2014-12-17 17:17:44
【问题描述】:

我收到此错误消息:传递 x 的参数 1 从指针生成整数而不进行强制转换。在传递一个 int 时,我以同样的方式做了同样的事情,而且效果很好。但是当我用 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分配额外的内存。这似乎很奇怪。我可能误解了它?那么为什么会这样呢。

【问题讨论】:

  • 请缩进你的代码

标签: c memory-management struct char strcpy


【解决方案1】:
"y" 

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

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

'y'

为了让您调用函数make 进行编译。


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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多