我收到此错误消息:传递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 回答
是一个字符串文字 . 这是一个指向以null结尾的字符数组的指针 .
您的函数接收单个字符,因此您需要传递一个字符文字:
为了调用函数
make
来编译 .您在最后一段中描述的更改完全改变了结构 . 它将成员从单个字符(内联分配)更改为指向以null结尾的字符数组的指针 . 而后一种变体需要为字符数组单独分配 . 这可能是你想要做的,只有你知道 . 但是你必须理解单个字符和指向以null结尾的字符数组的指针之间的区别 .
因此,请考虑问题中结构的版本:
您动态分配了一个结构,如下所示:
此时你已经完成了 . 结构的所有成员都由此单个调用分配 .
您在问题中讨论的结构的备用版本如下所示:
你会再次像这样分配结构:
再次,这将分配结构的所有成员 . 所以指针
n->y
被分配了 . 但缺少的一步是n->y
尚未初始化 . 通常,这将涉及到malloc
的进一步调用 . 这样做的功能可能如下所示:然后释放结构你会这样做: