Quiero entender qué se supone que debe hacer este código, porque Code :: Blocks no me muestra lo suficiente como para entenderlo por mi cuenta. El código en lenguaje C está abajo:

#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; 
}
2
painkiller 30 sep. 2019 a las 18:05

1 respuesta

La mejor respuesta

Para empezar, el código no es válido. En esta llamada

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

Debe usarse el especificador de conversión %zu en lugar de% d porque la expresión strlen(S -> S + 5) + S -> S[3] tiene el tipo size_t debido a las conversiones aritméticas habituales.

Durante la fase de preprocesamiento, estas dos cadenas

"123\0""45678"

Están concatenados en una cadena como

"123\00045678"

Donde \ 000 es un carácter en la notación octal.

Entonces esta expresión

strlen(S -> S + 5)

Produce la longitud de la subcadena "5678" que es 4.

Esta subexpresión

S -> S[3]

Produce el carácter '\000'.

Entonces 4 + 0 da 4 que se genera.

2
Vlad from Moscow 30 sep. 2019 a las 15:17