Pregunta de C

Alvaro Herrera alvherre en alvh.no-ip.org
Mar Mayo 9 20:07:10 CLT 2006


[Republicando desde la lista oss-devel en listas.ubiobio.cl]

Tengo una duda.  Supongase la funcion siguiente:

void
pgr_formtuple(Relation foo)
{
	int		natt = foo->natts;
	char    arr[natt];
	char	nulls[natt];

	...
}

Se aprecia que las variables arr y nulls son creadas como arreglos del
tamaño especificado que no es constante en tiempo de compilacion, sino
que se determina en tiempo de ejecucion dependiendo del contenido del
struct Relation.

Es valido esto?  Debo mencionar que compila perfectamente sin ningun
warning (con varias opciones -W), y que funciona perfectamente para
algunos valores de foo->natts.  Sin embargo, el programa se cae en un
caso muy particular que es cuando foo->natts es 61, un valor superior a
los valores tipicos.  (natts es el numero de columnas de una tabla; por
lo tanto 61 es un valor perfectamente valido pero tipicamente los
valores andan cercanos a la veintena).

Hay que hacer notar que la caida ocurre en codigo que no esta en el
ejemplo, pero es demasiado extenso para ponerlo aca.  (Puedo hacerlo si
alguien cree que vale la pena).


Lo que hice fue reemplazarlo por lo siguiente:

void
pgr_formtuple(Relation foo)
{
	int		natt = foo->natts;
	char   *arr;
	char   *nulls;

	arr = malloc(natt);
	nulls = malloc(natt);

	...

	free(arr);
	free(nulls);
}


Pero me queda la duda si lo de arriba es realmente erroneo.  Por otra
parte, yo se que lo siguiente si funciona:


void
pgr_formtuple(Relation foo)
{
	int		natt = foo->natts;

	{
		char    arr[natt];
		char	nulls[natt];

		...
	}
}

Aca la consideracion es que las variables estan creadas en un stack que
es interior al lugar donde se declara el tamaño que tendran las
variables.  Pero no se si esto realmente influya o sea solamente
cosmetico.

Cualquier comentario es bienvenido.

-- 
Alvaro Herrera                                http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support


Más información sobre la lista de distribución Linux