面试宝典之预处理、const与sizeof

时间:2024-08-31 14:34:38
#include <stdio.h>
#define SUB(x, y) x - y
#define ACCESS_BEFORE(element, offset, value) *SUB(&element, offset) =value int main(void)
{
int i; int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
ACCESS_BEFORE(array[5], 4, 6);
for (i = 0; i < 10; ++i){
printf("%d ", array[i]);
} return 0;
}

编译结果:

面试宝典之预处理、const与sizeof

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdWNhbjIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

分析:

SUB(x, y) x - y

ACCESS_BEFORE(element, offset, value) *SUB(&element, offset) =value

ACCESS_BEFORE(array[5], 4, 6);->*SUB(&array[5], 4) =6 ->*&array[5] - 4 =6

*&array[5]的值为6,则减去4等于2,将6赋值给2,则肯定是错误的。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

#include <iostream>
#include <string> using namespace std; struct {
short a1;
short a2;
short a3;
}A; struct {
long a1;
short a2;
}B; int main(void)
{
char *ss1 = "0123456789";
// int ss[100] = "0123456789"; cout << sizeof(A) << endl;
cout << sizeof(B) << endl;
cout << sizeof(ss1) << endl;
// cout << sizeof(ss) << endl; return 0;
}

面试宝典之预处理、const与sizeof

假设去掉代码中的凝视,则编译结果为:

面试宝典之预处理、const与sizeof

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdWNhbjIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

由此可见 int ss[100] = "0123456789"; 这个语句是不对的,所以对其求sizeof也是不对的。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

#include <stdio.h>

char var[10];
int test(char var[])
{
return sizeof(var);
} int main(void)
{
printf("%d\n", test(var));
return 0;
}

面试宝典之预处理、const与sizeof

var退化为数组的指针,而非数组。