我收到此错误消息:传递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分配额外的内存。这看起来很奇怪。我可能误会了吗?那么为什么会这样呢。
答案 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);
};