struct A {
long a;
int b;
};
int main(int argc, char* argv[]){
struct A num = {0x6e694c756f796978,0x7875};
char ch = '0';
for(int i = 0; ch; i++){
ch = *((char *)&num + i);
printf("%c",ch);
}
printf("n");
return 0;
}
xiyouLinux
家用计算机一般都为小端机,即低位在前。例如题中:0x7875 在计算机中“75”在前,“78”在后。for循环中先输出十六进制数“75”所对应的字符,后输出十六进制数“78”所对应的字符。
2. 改写代码,在不改变 const 的情况下尝试使用更多的方法改变b的值。
int main(int argc, char* argv[]){
const int b = 10;
// 自行添加语句,改变变量b的值
return 0;
}
如下:
int *p=(int *)&b; //由于b被const修饰,所以用强制类型转换,暴力使p指向b *p=1;
3. 阅读下面的代码,判断 a 中哪些元素被改变了,解释原因。
struct node {
char a;
int b;
short c;
};
struct n{
char a;
int b;
};
int main(int argc, char* argv[]){
struct node a[2] = {{1,2,3},{4,5,6}};
*(int *)((char *)a + 2 * sizeof(struct n)) = 100;
return 0;
}
a[1]中的b被改变了。
char占1字节,int占4字节,所以结构体n占8字节(char与int对齐)。
则 2 * sizeof(struct n)=16,由于结构体node的长度为12个字节,将a强制转换为char*类型后再加16,整个式子作为指针所指的是a[1].b(在结构体node中a,b,c各占4字节)。
4. 解释以下代码的输出结果。
void func(char *a)
{
printf("%lun", sizeof(a));
printf("%lun", strlen(a));
}
int main(int argc, char *argv[])
{
char a[] = "hello world";
char *b = "hello world";
printf("%sn", b);
func(a);
printf("%lun", sizeof(a));
printf("%lun", strlen(a));
}
hello world
8
11
12
11
b作为字符串的首地址,用%s即可输出该字符串,
在func中,传入的a本质是指针,指针的大小为8字节(64位操作系统),所以sizeof的结果为8,而strlen是计算字符串长度的函数,可直接将首地址a传入计算得11。
在主函数中,sizeof(a)计算的是数组的大小,由于该字符串数组后面自动补了“ ”,所以结果为12。strlen()计算字符串长度,不包括末尾的“ ”。
5. 解释以下代码的输出结果。
#define f(a, b) a##b
#define g(a) #a
#define h(a) g(a)
int main(int argc, char *argv[])
{
printf("%sn", h(f(1, 2)));
printf("%sn", g(f(1, 2)));
}
#define做的是单纯的文本替换,先将所有的宏定义收集起来,然后处理源代码,发现一个宏定义符就立即替换。
##:连接操作。如宏中 1##2 得到的是 12(非字符串)
#:字符串化。如#f(1,2)得到的是"f(1,2)"
由于宏不处理字符串,则"f(1,2)"被保留了下来作为字符串输出了。
(1) 当宏中有#运算符时,#后面的将不再被替换;
(2) 当宏中有##运算符时,则先替换外层,再替换里层;
8. 下面这段程序有错吗?如果有错请指出并改正。
#includevoid func(char *p) { p = (char *)malloc(sizeof(char)); } int main(int argc, char *argv[]) { char *s = NULL; func(s); strcpy(s, "I love xiyou_linux"); puts(s); }
改正:
#includechar * func(void) { char* p = (char *)malloc(sizeof(char)); return p; } int main(int argc, char *argv[]) { char *s = func(); strcpy(s, "I love xiyou_linux"); puts(s); }



