Printf更改内存值

时间:2013-06-12 11:23:48

标签: c printf

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

3 个答案:

答案 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 :-)
}