Jump to content

Duda con código en C


Recommended Posts

Tengo el siguiente código en C

 

#include <stdio.h>
#include <stdlib.h>
typedef struct _prueba {
   int x;
   int y;
}prueba;

int main(int argc, char** argv)
{
  int n;
  int i;
  char test[atoi(argv[1])];
  for(i=0; i<atoi(argv[1]);i++)
    test[i]='a'+i;
  printf("Pidiendo %i bytes, largo pedido %i\n",atoi(argv[1]),sizeof(test));
  printf("Ingrese el largo: ");
  scanf("%i",&n);
  char test2[n];
  for(i=0;i<n;i++)
      test2[i]='a'+i;
  printf("Largo de test2: %i\n",sizeof(test2));
  char *test3=(char*)malloc(sizeof(char)*(n+1));
  printf("Largo de test3: %i\n",sizeof(test3));
  free(test3);
  prueba nprueba[n];
  for(i=0;i<n;i++){
   nprueba[i].x=i;
      nprueba[i].y=i+1;
  }
  printf("Largo de nprueba: %i\n",sizeof(nprueba));
  return 0;
}

 

lo compilo asi: gcc -ansi asdf.c -o asdf

 

y no se por que funciona, por lo que se no deberia funcionar.

Link to comment
Share on other sites

#include <stdio.h>
#include <stdlib.h>
typedef struct _prueba {
   int x;
   int y;
}prueba;

int main(int argc, char** argv)
{
  int n;
  int i;
[b]   char test[atoi(argv[1])];[/b]
  for(i=0; i<atoi(argv[1]);i++)
[b]            test[i]='a'+i;[/b]
  printf("Pidiendo %i bytes, largo pedido %i\n",atoi(argv[1]),sizeof(test));
  printf("Ingrese el largo: ");
  scanf("%i",&n);
[b]   char test2[n];[/b]
  for(i=0;i<n;i++)
[b]       test2[i]='a'+i;[/b]
  printf("Largo de test2: %i\n",sizeof(test2));
  char *test3=(char*)malloc(sizeof(char)*(n+1));
  printf("Largo de test3: %i\n",sizeof(test3));
  free(test3);
[b]   prueba nprueba[n[/b][b]][/b];
  for(i=0;i<n;i++){
          nprueba[i].x=i;
      nprueba[i].y=i+1;
  }
  printf("Largo de nprueba: %i\n",sizeof(nprueba));
  return 0;
}

 

Hace tiempo que no programo en C asi que puede que este equivocado:

A los vectores se les debe declarar el largo y no te permite insertarle una variable para declarar el lago, si no conoces el largo del vector debes trabajarlo con memoria dinamica como lo hiciste en test3

Y no entiendo lo que haces en los for, estas ingresando en la casilla del vector la suma del valor ASCII del char a y el valor del int i, podrias decir cual es el fin del programa para entenderlo mejor.

Por lo que recuerdo tampoco se puede pedir memoria para un vector de structs con una variable, lo que debes hacer es crear una lista enlazada simple por lo que deberas incluir un prueba *head.

Prueba con esos cambios, en teoria deberia funcionar

Link to comment
Share on other sites

#include <stdio.h>
#include <stdlib.h>
typedef struct _prueba {
int x;
int y;
}prueba;

int main(int argc, char** argv)
{
  int n;
  int i;
[b]   char test[atoi(argv[1])];[/b]
  for(i=0; i<atoi(argv[1]);i++)
[b]			test[i]='a'+i;[/b]
  printf("Pidiendo %i bytes, largo pedido %in",atoi(argv[1]),sizeof(test));
  printf("Ingrese el largo: ");
  scanf("%i",&n);
[b]   char test2[n];[/b]
  for(i=0;i<n;i++)
[b]	   test2[i]='a'+i;[/b]
  printf("Largo de test2: %in",sizeof(test2));
  char *test3=(char*)malloc(sizeof(char)*(n+1));
  printf("Largo de test3: %in",sizeof(test3));
  free(test3);
[b]   prueba nprueba[n[/b][b]][/b];
  for(i=0;i<n;i++){
	   nprueba[i].x=i;
   nprueba[i].y=i+1;
  }
  printf("Largo de nprueba: %in",sizeof(nprueba));
  return 0;
}

 

Hace tiempo que no programo en C asi que puede que este equivocado:

A los vectores se les debe declarar el largo y no te permite insertarle una variable para declarar el lago, si no conoces el largo del vector debes trabajarlo con memoria dinamica como lo hiciste en test3

Y no entiendo lo que haces en los for, estas ingresando en la casilla del vector la suma del valor ASCII del char a y el valor del int i, podrias decir cual es el fin del programa para entenderlo mejor.

Por lo que recuerdo tampoco se puede pedir memoria para un vector de structs con una variable, lo que debes hacer es crear una lista enlazada simple por lo que deberas incluir un prueba *head.

Prueba con esos cambios, en teoria deberia funcionar

 

Se todo lo que me dices, lo que esta dentro de los ciclos era para ver si el programa se cae. y lo de las estructuras lo hice para probar si al igual que con vectores "normales" funcionaba con vectores de estructuras.

 

Mi pregunta es ¿por que funciona?

 

EDIT: como pueden ver el programa no tiene ninguna funcionalidad, solo es para preguntar por que funciona.

Edited by FabianAnarco
Link to comment
Share on other sites

Porque que yo sepa en ANSI C no se puede "pedir" memoria así: "char array[n]"

En esa instrucción solo estás creando un array de caracteres de largo n....el hecho de que no te lo enseñasen no significa que no se pueda hacer....es una instrucción totalmente válida.

 

Saludos :krider:

Link to comment
Share on other sites

Porque que yo sepa en ANSI C no se puede "pedir" memoria así: "char array[n]"

En esa instrucción solo estás creando un array de caracteres de largo n....el hecho de que no te lo enseñasen no significa que no se pueda hacer....es una instrucción totalmente válida.

 

Saludos :krider:

 

Estimado, creo que estas equivocado, http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html ahi dice claramente que eso se acepta pero solo en C90 y cuando yo compilo le paso la opcion -ansi, tambien le pase la opcion -std=c89 y no hubo siquiera un warning, además por lo que recuerdo a mi me enseñaron que asi no se declaraban arrays de largo variable(me enseñaron ANSI C), si no que se hace por malloc o variantes.

 

Quizas sea un error en el compilador que no pesca la opcion -ansi que le estoy pasando

Link to comment
Share on other sites

Porque que yo sepa en ANSI C no se puede "pedir" memoria así: "char array[n]"

En esa instrucción solo estás creando un array de caracteres de largo n....el hecho de que no te lo enseñasen no significa que no se pueda hacer....es una instrucción totalmente válida.

 

Saludos :krider:

 

Estimado, creo que estas equivocado, http://gcc.gnu.org/o...ble-Length.html ahi dice claramente que eso se acepta pero solo en C90 y cuando yo compilo le paso la opcion -ansi, tambien le pase la opcion -std=c89 y no hubo siquiera un warning, además por lo que recuerdo a mi me enseñaron que asi no se declaraban arrays de largo variable(me enseñaron ANSI C), si no que se hace por malloc o variantes.

 

Quizas sea un error en el compilador que no pesca la opcion -ansi que le estoy pasando

Si compila y funciona, pues, entonces el que está equivocado es otro...tal vez el compilador..o yo, o tú....tal vez puede ser un bug, del gcc, o tal vez se les bugeo el paso de argumentos....la cosa es que funciona y yo a veces también lo hice para experimentar, cuando pasamos Ansi C en la U, arreglos de largo variable....mientras la variable esté declarada y con un valor asignado, antes de la creación del array, pues, por lenguaje debiese funcionar(en ningún momento pasa a llevar al sintaxis ni nada en el código)...si todo está en regla, para C funciona....lo otro ya es compilador y estándares.

 

Saludos :krider:

Link to comment
Share on other sites

A ver, ANSI C no permite arreglos con largo desconocido en tiempo de compilación :no: (eso lo enseñan en el jardín infantil :tonto: ). Si alguien se acostumbró a que el IDE o compilador que usa no tire error, es simplemente porque el compilador no cumple con el estándar ó no está usando las opciones de compilación adecuadas ó lo está compilando como C++ ó el compilador se rige por el estándar pero le agrega algunas "extensiones" (o sea, cumple con el estándar, pero se da algunas licencias).

 

En este caso es por lo último, es decir, al usar la opción -ansi en GCC, el compilador de todas formas agrega algunas extensiones al lenguaje (que no son compatibles con ANSI C), así que técnicamente no está cumpliendo con el estándar. La explicación está aquí. La parte importante es esta:

 

The -ansi option does not cause non-ISO programs to be rejected gratuitously. For that, -pedantic is required in addition to -ansi.

 

Si alguien no tiene claro por qué hablan indistintamente de ANSI e ISO, lea la sección 2.1 aquí.

 

Así que para lograr que el compilador, por fin, mande el tan anhelado error o advertencia :tonto: habría que agregar la opción -pedantic. Por si acaso, en vez de -pedantic, se puede usar -pedantic-errors para que tire errores (y no sólo advertencias).

 

Hasta donde recuerdo, el Turbo C++ no aceptaba programas C con largos de arreglo variables al compilar usando la opción ANSI C (también había otras opciones como K&R).

Edited by susodicho
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...