C 有人能给我解释一下如何浏览这个代码吗?

C 有人能给我解释一下如何浏览这个代码吗?,c,string-concatenation,c-strings,strlen,pointer-arithmetic,C,String Concatenation,C Strings,Strlen,Pointer Arithmetic,我想理解这段代码应该做什么,因为代码::块并没有向我展示足够的信息,我自己无法理解。 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 =

我想理解这段代码应该做什么,因为代码::块并没有向我展示足够的信息,我自己无法理解。 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\0""45678";
    printf("%d", strlen(S -> S + 5) + S -> S[3]); 
    free(S);
    return 0; 
}
#包括
#包括
#包括
结构{
char*S;
};
int main(void){
结构S*S=(结构S*)malloc(sizeof(结构S));
S->S=“123\0”45678;
printf(“%d”,strlen(S->S+5)+S->S[3]);
免费的;
返回0;
}

对于初学者,代码无效。在这个电话里

printf("%d", strlen(S -> S + 5) + S -> S[3]); 
必须使用转换说明符
%zu
而不是%d,因为表达式
strlen(S->S+5)+S->S[3]
由于通常的算术转换而具有类型大小

在预处理阶段,这两个字符串

"123\0""45678"
连接在一个字符串中,如

"123\00045678"
其中\000是八进制表示法中的一个字符

所以这个表达式

strlen(S -> S + 5)
S -> S[3]
生成子字符串“5678”的长度,即4

这个子表达式

strlen(S -> S + 5)
S -> S[3]
产生字符
'\000'


所以
4+0
给出了输出的
4

你确定这是你的代码吗?如果你不明白,你是怎么写的?编辑:我是sry,我忽略了一个“the”并阅读“…为了理解我的代码…”@thesalion-我没有看到任何声称这是他们自己的代码。这个代码是故意混淆的。我建议你从代码开始,不要试图混淆你,而是让读者更容易理解他们的工作。这不是我的代码,我只是想理解它,仅此而已。提前感谢。请注意,您不应在点
或箭头
->
运算符周围使用空格;它们绑定得很紧,空格不合适,是新手工作的标志。请详细解释两件事:预处理阶段,将这两个字符串连接成一个字符串(哪行代码显示),以及strlen(S->S+5),它是如何仅显示最后4位数字的。谢谢。@painkiller在这个表达式S->S+5中使用了指针算法。这个表达式指向数组的第6个字符。这相当于&S->S[5],关于预处理阶段,什么是不清楚的?编译器将两个字符串彼此连接起来..好的,那么S->S+5,它又是&S-S[5],它是索引5,但请记住这是一个数组,从索引0开始,它是第6个元素。我知道这一点。对于预处理阶段,您的意思是编译器不接受“123\0”“45678”变量,因为有两个字符串,而不是一个?所以它把它们粘在一起成了一根大绳子?没有任何附加的代码行强制他显式地这样做?(像strcat函数那样)?谢谢你的回答@painkiller编译器接受此记录,但将它们作为一个字符串连接在一起。@painkiller我已经说过这是编译的预处理阶段。什么是不清楚的?