我正在尝试做一些定点矢量数学,似乎每当我打印任何东西时,似乎并不重要。我的向量的值发生了变化。该代码使用Zilog的ZDSII开发者工作室编译。
我有一个像这样定义的结构
typedef struct {
long x;
long y;
} vector;
结构中的值在函数
中初始化void initVector( vector * vec, int x, int y ) {
vec -> x = (long) x << 14;
vec -> y = (long) y << 14;
}
在我的主要功能中我有
int main() {
vector * vector1;
initVector( vector1, 1, 2 );
printf( "foo" ); // this prints alright
printf( "%d , %d", vector1 -> x >> 14, vector1 -> y >> 14 ); //garbage
...
...
}
打印垃圾。这些值将根据我实际打印值的printf之前的printf语句的数量而改变。
答案 0 :(得分:4)
您使用vector1
未初始化,
vector * vector1;
initVector( vector1, 1, 2 );
所以initVector
调用未定义的行为。
成功
vector vector1;
initVector(&vector1, 1, 2);
或
vector * vector1 = malloc(sizeof *vector1);
答案 1 :(得分:3)
您没有为vector1
指定内存,因此initVector()
中的代码会随机覆盖某些内容并导致未定义的行为。
您的代码应为:
vector vector1; /* NOT a pointer! */
initVector(&vector1, 1, 2);
printf( "foo" ); // this prints alright
printf( "%d , %d", vector1.x >> 14, vector1.y >> 14 );
为了使API更易于使用,请考虑将vector
结构视为值,并执行以下操作:
vector initVector(int x, int y)
{
vector v;
v.x = (long) x << 14;
v.y = (long) y << 14;
return v;
}
这使代码更易于使用,并消除了此特定错误的风险:
int main(void)
{
vector vector1 = initVector(1, 2);
printf("%d, %d\n", vector1.x >> 14, vector1.y >> 14);
}
答案 2 :(得分:1)
为vector1
分配内存,例如:
int main()
{
vector vector1;
initVector( &vector1, 1, 2 );
printf( "%d , %d", vector1.x >> 14, vector1.y >> 14 ); //no garbage :-)
}