Sí, la idea general de la hack es válido, pero al menos como lo leí, no se han puesto en práctica con razón. Esta cantidad que hemos hecho a la derecha:
f = malloc(num + sizeof(foo) + MAX_COMMENT_SIZE);
f->data = f + 1; // is this OK?
Pero esto es incorrecto:
f->comment = f + 1 + num;
Desde f
es foo *
, la f+1+num
se calcula en términos de sizeof(foo)
- es decir, que es equivalente a decir f[1+num]
- - Intenta indexar al 1+num
thfoo
en una matriz. Estoy bastante seguro de que es no lo que quiere. Cuando asigna los datos, está pasando sizeof(foo)+num+MAX_COMMENT_SIZE
, entonces lo que está asignando espacio es num char
s, y lo que (presumiblemente) desea es señalar f->comment
a un punto en la memoria que es num char
s después de f->data
, que sería más de esta manera:
f->comment = (char *)f + sizeof(foo) + num;
casting f
a un char *
fuerza la matemáticas por hacer en términos de char
s en lugar de foo
s.
otoh, ya que siempre está asignando MAX_COMMENT_SIZE
para comment
, probablemente simplificar las cosas (bastante) un poco, y usar algo como esto:
typedef struct foo {
char comment[MAX_COMMENT_SIZE];
size_t num_foo;
char data[1];
}foo;
Y luego asignarlo como:
foo *f = malloc(sizeof(foo) + num-1);
f->num_foo = num;
y que va a trabajar sin ningún tipo de manipulación de punteros en absoluto.Si usted tiene un compilador C99, puede modificar esta ligeramente:
typedef struct foo {
char comment[MAX_COMMENT_SIZE];
size_t num_foo;
char data[];
}foo;
y asignar:
foo *f = malloc(sizeof(foo) + num);
f->num_foo = num;
Esto tiene la ventaja adicional de que el estándar de hecho lo bendice, aunque en este caso la ventaja es bastante minor (creo que la versión con funcionará con cada compilador C89/90 existente).
Como usted sabe pero probablemente valga la pena señalar, el miembro flexible de la matriz al final de la estructura solo funciona cuando tiene un elemento de longitud variable. La pregunta tiene dos elementos de longitud variable ('datos' y' comentario') y no puede usar fácilmente la técnica. –
En ese caso, almacene el 'comentario' como una cadena' malloc() 'normal asignada. –
FWIW, di esta respuesta antes de agregar el campo de comentarios. Con un comentario agregado, siga el consejo de Donal. –