Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

106
Visualizações
Asignando matriz a un int en C

He escrito el siguiente código en C

 int main(){ int a = {1, 2, 3}; }

Parece que la variable asignada, en este caso a, siempre toma el valor del primer elemento del arreglo. Ahora me pregunto si los otros elementos de la matriz se descartan o se escriben en la memoria después de a, lo que provoca un desbordamiento del búfer.

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Esta declaración

 int a = {1, 2, 3};

es semánticamente inválida (rompe la regla semántica a la que se hace referencia a continuación). Un objeto escalar no puede ser inicializado por una lista de inicializadores entre llaves con más de un inicializador.

Del Estándar C (6.7.9 Inicialización)

11 El inicializador de un escalar será una sola expresión, opcionalmente encerrada entre llaves. El valor inicial del objeto es el de la expresión (después de la conversión); se aplican las mismas restricciones de tipo y conversiones que para la asignación simple, tomando el tipo del escalar como la versión no calificada de su tipo declarado.

Es decir, la coma en la lista de inicializadores entre llaves se considera como un separador de inicializadores y para un objeto escalar solo se permite una sola expresión.

Cuando hay más de un inicializador presente, el compilador asume que el objeto inicializado es un agregado.

Para declarar una matriz necesitas escribir

 int a[] = {1, 2, 3};

o

 int a[N] = {1, 2, 3};

donde N es un valor entero igual o mayor que 3.

over 4 years ago · Santiago Trujillo Relatório

0

int a = {1, 2, 3}; no es un código C válido.

Es la llamada violación de restricción en el estándar C, después de lo cual se requiere que un compilador emita un mensaje de diagnóstico:

C17 6.7.9/2:

Restricciones
Ningún inicializador intentará proporcionar un valor para un objeto que no esté contenido dentro de la entidad que se está inicializando.

Sin embargo, no es un error de sintaxis, en realidad podemos escribir cosas extrañas como int a = {1}; con un único inicializador entre llaves. Sin embargo, el resultado, sin importar el motivo del error, es el mismo: los compiladores deben emitir mensajes de diagnóstico para todas las violaciones de restricciones y sintaxis.

Para evitar perder el tiempo solucionando problemas de código C inválido como este, estudie ¿Qué opciones de compilador se recomiendan para los principiantes que aprenden C?


En cuanto a lo que hacen los compiladores como gcc y clang cuando se enfrentan a un código no estándar, parecen simplemente descartar los inicializadores superfluos. Si compilo este código con gcc/clang para x86 e ignoro el mensaje de diagnóstico:

 int foo (void) { int a = {1, 2, 3}; return a; }

El ensamblado x86 resultante es

 mov eax, 1 ret

Que cuando se traduce de nuevo a C es 100% equivalente a

 int foo (void) { return 1; }

Sin embargo, es importante comprender que esta es una extensión de compilador no estándar y que no tiene un comportamiento garantizado o portátil.

over 4 years ago · Santiago Trujillo Relatório

0

int main(void) { int a[3] = {1, 2, 3}; printf("%d\n", a[0]); return(0); }
 Output : 1
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda