我准备参加我的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
指向的内存答案 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;