2

我正在尝试做一些定点向量数学,似乎每当我打印任何东西时,似乎都无关紧要。我的向量的值发生了变化。该代码是使用 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 语句的数量而变化。

4

3 回答 3

4

你使用vector1未初始化的,

vector * vector1;

initVector( vector1, 1, 2 );

所以initVector调用未定义的行为。

做了

vector vector1;
initVector(&vector1, 1, 2);

或者

vector * vector1 = malloc(sizeof *vector1);
于 2013-06-12T11:26:38.070 回答
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);
}
于 2013-06-12T11:26:20.313 回答
1

为 分配内存vector1,例如:

int main()
{
    vector vector1;

    initVector( &vector1, 1, 2 );
    printf( "%d , %d", vector1.x >> 14, vector1.y >> 14 ); //no garbage :-)
}
于 2013-06-12T11:28:09.173 回答