Post by David Serrano (Hue-Bond)Post by Antoine LecaPost by David Serrano (Hue-Bond)malloc1.c:2: aviso: inicialización se crea un puntero desde un
entero sin una conversión
Vale. Y cuando se modifica la declaración de matriz para long**
(sin corregir la llamada a malloc()), ¿qué te dice tu compilador?
Probablemente un error,
No. El compilador no te dice nada. Y es el problema.
# type malloc3.c
#include <stdlib.h>
int main () {
double *a = malloc (sizeof (float));
return a ? free(a), EXIT_SUCCESS : EXIT_FAILURE;
}
# gcc -W -Wall -ansi -pedantic malloc3.c
# gcc -v
Reading specs from bin/../lib/gcc/mingw32/3.4.2/specs
Configured with:
../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as --host=
mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --en
able
-languages=c,c++,f77,ada,objc,java --disable-win32-registry --disable-shared
--e
nable-sjlj-exceptions --enable-libgcj --disable-java-awt --without-x --enabl
e-ja
va-gc=boehm --disable-libgcj-debug --enable-interpreter --enable-hash-synchr
oniz
ation --enable-libstdcxx-debug
Thread model: win32
gcc version 3.4.2 (mingw-special)
:-(
(He utilizado double y float para que vees que incluso cuando son de tamaño
diferente en la plataforma, no se entere.)
Post by David Serrano (Hue-Bond)pero me lo tendría ganado por no #incluir <stdlib.h>.
No digo eso. Es *preciso* incluirlo, en cualquier caso. Por ejamplo, en 64
bits (Linux or Windows sería ígual), si no lo incluyes, el compilador se
equivocaría a copiar solo 32 bits en a.
Post by David Serrano (Hue-Bond)El malloc2 no da error ni lo dará si cambio el tipo de
dato.
malloc3 (malloc2 con el tipo cambiado una vez pero no en la llamada a
malloc) no da error, pero es un monstruo. Es demasiado senzillo y
functionará. Pero cambies para una alocación de tabla, y cambies int por
long, y te resulta un programa que functiona bién en un PC normal y
corriente, y explota fuera.
Mientras tanto
# type malloc4.c
#include <stdlib.h>
#define NUM_ELEM 100
int main () {
long **a;
/* muchas instruciones */
a = (int**)malloc (NUM_ELEM * sizeof (int));
return a ? free(a), EXIT_SUCCESS : EXIT_FAILURE;
}
# gcc -W -Wall -ansi -pedantic malloc4.c
malloc4.c: In function `main':
malloc4.c:10: warning: assignment from incompatible pointer type
Antoine