有人可以向我解释如何遍历这段代码吗?
Can someone explain to me how to walk through this code?
我想了解这段代码的用途,因为 Code::Blocks 不足以让我自己理解。
C语言代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct S {
char *S;
};
int main(void) {
struct S *S = (struct S *) malloc(sizeof(struct S));
S -> S = "123[=10=]""45678";
printf("%d", strlen(S -> S + 5) + S -> S[3]);
free(S);
return 0;
}
对于初学者来说,代码无效。在这次通话中
printf("%d", strlen(S -> S + 5) + S -> S[3]);
必须使用转换说明符 %zu
而不是 %d 因为表达式 strlen(S -> S + 5) + S -> S[3]
由于通常的算术转换而具有类型 size_t。
在预处理阶段这两个字符串
"123[=11=]""45678"
连接成一个字符串,如
"123[=12=]045678"
其中 \000 是八进制表示法中的一个字符。
所以这个表达式
strlen(S -> S + 5)
产生子字符串 "5678"
的长度为 4。
这个子表达式
S -> S[3]
生成字符 '[=18=]0'
。
所以4 + 0
给出了输出的4
。
我想了解这段代码的用途,因为 Code::Blocks 不足以让我自己理解。 C语言代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct S {
char *S;
};
int main(void) {
struct S *S = (struct S *) malloc(sizeof(struct S));
S -> S = "123[=10=]""45678";
printf("%d", strlen(S -> S + 5) + S -> S[3]);
free(S);
return 0;
}
对于初学者来说,代码无效。在这次通话中
printf("%d", strlen(S -> S + 5) + S -> S[3]);
必须使用转换说明符 %zu
而不是 %d 因为表达式 strlen(S -> S + 5) + S -> S[3]
由于通常的算术转换而具有类型 size_t。
在预处理阶段这两个字符串
"123[=11=]""45678"
连接成一个字符串,如
"123[=12=]045678"
其中 \000 是八进制表示法中的一个字符。
所以这个表达式
strlen(S -> S + 5)
产生子字符串 "5678"
的长度为 4。
这个子表达式
S -> S[3]
生成字符 '[=18=]0'
。
所以4 + 0
给出了输出的4
。