我有两个相同(但命名不同)的C结构:
typedef struct {
double x;
double y;
double z;
} CMAcceleration;
typedef struct {
double x;
double y;
double z;
} Vector3d;
Run Code Online (Sandbox Code Playgroud)
现在我想将一个CMAcceleration变量赋给一个Vector3d变量(复制整个结构).我怎样才能做到这一点?
我尝试了以下但是得到了这些编译错误:
vector = acceleration; // "incompatible type"
vector = (Vector3d)acceleration; // "conversion to non-scalar type requested"
Run Code Online (Sandbox Code Playgroud)
当然,我可以单独设置所有成员:
vector.x = acceleration.x;
vector.y = acceleration.y;
vector.z = acceleration.z;
Run Code Online (Sandbox Code Playgroud)
但这似乎很不方便.
什么是最好的解决方案?
请考虑以下代码.
enum type {CONS, ATOM, FUNC, LAMBDA};
typedef struct{
enum type type;
} object;
typedef struct {
enum type type;
object *car;
object *cdr;
} cons_object;
object *cons (object *first, object *second) {
cons_object *ptr = (cons_object *) malloc (sizeof (cons_object));
ptr->type = CONS;
ptr->car = first;
ptr->cdr = second;
return (object *) ptr;
}
Run Code Online (Sandbox Code Playgroud)
在cons函数中,变量ptr是类型cons_object*.但是在返回值中它被转换为类型object*.
cons_object它object是不同的结构.有什么想法吗!
在C中,有符号整数和无符号整数在内存中的存储方式不同.当类型在运行时清除时,C还隐式转换有符号整数和无符号整数.但是,当我尝试以下代码段时,
#include <stdio.h>
int main() {
unsigned int a = 5;
signed int b = a;
signed int c = *(unsigned int*)&a;
signed int d = *(signed int*)&a;
printf("%u\n", a);
printf("%i\n", b);
printf("%i\n", c);
printf("%i\n", d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
预期产量:
5
5 //Implicit conversion occurs
5 //Implicit conversion occurs, because it knows that *(unsigned int*)&a is an unsigned int
[some crazy number] //a is casted directly to signed int without conversion
Run Code Online (Sandbox Code Playgroud)
然而,实际上,它输出
5
5
5
5
Run Code Online (Sandbox Code Playgroud)
为什么?