c - 为 char 分配额外内存而不是为已分配结构中的 int 分配额外内存?

标签 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 分配额外的内存。这似乎很奇怪。我可能误会了吗?那么为什么会这样。

最佳答案

"y" 

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

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

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

关于c - 为 char 分配额外内存而不是为已分配结构中的 int 分配额外内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26504364/

相关文章:

c - 在 C 中将数组的内容传输到另一个数组

ios - 弹出 UIViewController 后,MKMapView autorelease 不调用 dealloc

xcode - 检查 Swift 中的类对象计数

c++ - 以错误的方式删除数组

pointers - 如何 WDDX ColdFusion 结构并维护指针或递归

C 结构体声明

c - C 中的方形问题

c - c 指针段错误

c - 海湾合作委员会正则表达式

ios - 尝试快速遍历结构数组时出现奇怪的语法