需要帮助在我的c认证考试中解读隐秘代码

时间:2016-09-15 03:24:04

标签: c pointers malloc

我准备参加我的c认证考试,其中一个练习题确实让我难过。我希望有些c专家可以帮助我理解这段代码(是的,我知道这段代码是人为的,但这就是我通过这个证书考试所要处理的):

#include <stdio.h> 
#include <stdlib.h>
int main(void) { 
    float *t = 1 + (float *) malloc(sizeof(float) * sizeof(float));
    t--;
    *t = 8.0;
    t[1] = *t / 4.0;
    t++;
    t[-1] = *t / 2.0;
    printf("%f\n",*t);
    free(--t);
    return 0; 
}

我要记下我认为每条线的作用以及验证/更正。

1:定义变量t,它是一个指向float类型的指针。由于我不知道这个系统运行了多少类型,我不知道如何知道正在分配的内存大小。在分配之后,我们添加1,我认为应该移动指针,但不确定

2:将指针向后移动一个?

3:将值8.0分配给t

指向的内存

4:将8.0(* t)除以4.0并得出2,但我不明白在这种情况下t [1]是什么

5:移动指针?但是因为它的类型是float *

6:将指针向后移动1并指定* t / 2.0(此时无法确定* t是什么)

7:打印出t

指向的值

8:释放--t

指向的内存

1 个答案:

答案 0 :(得分:1)

// Allocate a number of floats in memory
// t points to the second allocated float due to "1 + ..."
float *t = 1 + (float *) malloc(sizeof(float) * sizeof(float));

// t now points to the first allocated float
t--;

// first allocated float is set to 8.0
*t = 8.0;

// second allocated float is set to 2.0 (i.e. 8.0/4.0)
// note: t[1] is the same as *(t + 1)
t[1] = *t / 4.0;

// t now points to the second allocated float
t++;

// first allocated float is set to 1.0 (i.e. 2.0/2.0)
// note: t[-1] is the same as *(t - 1)
t[-1] = *t / 2.0;

// Prints 2.0 as t still points to the second allocated float
printf("%f\n",*t);

// Decrement t, i.e. t points to first allocated float
// and free the memory
free(--t);

// End the program by returning from main
return 0;