¿Por qué A y B resultan en una falla de segmentación? Porque a pesar de que a x no se le ha asignado un valor, técnicamente todavía tiene un valor basura, ¿verdad? Además, ¿por qué D no es una falla de segmentación? Mi clave de respuesta dice que A y B son fallas de segmentación, pero eso parece incorrecto. D debería ser el que tiene una falla de segmentación porque está intentando devolver 0. ¿Puede alguien corregirme si me equivoco?

UNA.

    int x; 
    int* p = &x;
    cout << p << *p << endl; 

SI.

  int* p = new int;
  cout << p << *p <<endl;

C.

  int* p;
  cout << p << *p <<endl;

D.

  int* p = 0;
  cout << p << *p <<endl;
3
miBo777 8 dic. 2019 a las 13:40

2 respuestas

La mejor respuesta

¿Por qué A y B resultan en una falla de segmentación?

Mientras ambos leen el valor no inicializado de *p, que es un comportamiento indefinido, ninguno producirá una falla de segmentación en cualquier sistema actual.

Tanto C como D también tienen un comportamiento indefinido, y puede producir una falla de segmentación en máquinas actuales con ciertos compiladores y ciertas opciones de optimización. Una falla de segmentación no está garantizada, pero es muy probable aquí.

Esta fue una pregunta en una prueba de práctica que preguntó, cuál de estos resultados en una falla de segmentación. Y la clave de respuesta decía que eran A y B.

Debe haber invertido el significado de la pregunta (p. Ej., "Cuál de estos no produce un error de segmentación") o la clave de respuesta es incorrecta.

0
Employed Russian 8 dic. 2019 a las 20:35

"a pesar de que a x no se le ha asignado un valor, técnicamente todavía tiene un valor basura, ¿verdad?" - Incorrecto . Tiene un valor indeterminado y leerlo es UB.

Leer una variable no inicializada es Comportamiento indefinido. no se le permite hacer eso y, como resultado, todo el programa no es válido y no tiene sentido. Consulte también https://en.cppreference.com/w/cpp/language/ub

En sus ejemplos, A es UB porque la impresión *p lee el valor de x que no se ha inicializado. B es UB porque int señalado por p no está inicializado. C es UB porque p no está inicializado. D es UB porque *p desreferencia a nullptr.

Todos sus ejemplos son códigos inválidos y el compilador puede generar cualquier resultado que desee y no tiene que decirle que hizo algo mal. Es su responsabilidad conocer todas las reglas del idioma y seguirlas en todo momento.

Material de lectura adicional recomendado:

Lo que todo programador de C debe saber sobre el comportamiento indefinido # 1/3

Lo que todo programador de C debe saber sobre el comportamiento indefinido # 2/3

Lo que todo programador de C debe saber sobre el comportamiento indefinido # 3/3

Comportamiento indefinido en 2017

Una guía para el comportamiento indefinido en C y C ++, Parte 1

Una guía para el comportamiento indefinido en C y C ++, Parte 2

Una guía para el comportamiento indefinido en C y C ++, Parte 3

1
Jesper Juhl 8 dic. 2019 a las 12:05