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