我正在准备参加c认证考试,而实践问题之一确实让我感到困惑。我希望一些C专家可以帮助我理解此代码(是的,我知道该代码是人为设计的,但这是我要通过此cert测试所要处理的内容):

#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指向的内存

最佳答案

// 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;

关于c - 在我的C认证考试中需要帮助来解密密码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39502659/

10-12 15:02