Может кто-нибудь объяснить мне, как пройти через этот код? - PullRequest
2 голосов
/ 30 сентября 2019

Я хочу понять, что должен делать этот код, потому что 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\0""45678";
    printf("%d", strlen(S -> S + 5) + S -> S[3]); 
    free(S);
    return 0; 
}

1 Ответ

2 голосов
/ 30 сентября 2019

Для начала код недействителен. В этом вызове

printf("%d", strlen(S -> S + 5) + S -> S[3]); 

вместо% d должен использоваться спецификатор преобразования %zu, поскольку выражение strlen(S -> S + 5) + S -> S[3] имеет тип size_t из-за обычных арифметических преобразований.

Во времяНа этапе предварительной обработки эти две строки

"123\0""45678"

объединяются в одну строку, например

"123\00045678"

, где \ 000 - один символ в восьмеричной записи.

Итак, это выражение

strlen(S -> S + 5)

возвращает длину подстроки "5678", равной 4.

Это подвыражение

S -> S[3]

возвращает символ '\000'.

Итак, 4 + 0 дает 4, которое выводится.

...