¿Por qué la stack se corrompe?

int compare_chars(const void* a, const void* b) { char* c1 = (char*)a; char* c2 = (char*)b; return *c1 - *c2; } int main(int argc, char* argv) { FILE* file = fopen("c:\\file.txt", "r"); assert(file != NULL); char word[10] = { 0 }; while (!feof(file)) { fscanf(file, "%s", &word); qsort(word, 10, sizeof(char), &compare_chars); for (int i = 0; i < 10; i++) printf("%c", word[i]); printf("\n"); } fclose(file); } 

Recibo el siguiente mensaje:

Error en la verificación en tiempo de ejecución # 2: la stack alrededor de la variable ‘palabra’ estaba dañada.

Sucede en un archivo válido que contiene solo “0123456789” (10 caracteres).

¿Por qué?

En la statement fscanf

  fscanf(file, "%s", &word); ^not needed (remove &) 

char word[10] = { 0 };

Las cadenas están null terminated . Por lo tanto, aumente el tamaño de la word matriz para incluir '\0' .

También while (!feof(file)) es incorrecto.

EDITAR

En su lugar puedes controlar loop con fscanf

 while(fscanf(file, "%s", word)==1){ // your code } 

Debido a que una vez completado con éxito, fscanf devolverá el número de elementos de entrada coincidentes y asignados con éxito.

Aquí, en su caso, fscanf devolverá 1 en caso de éxito.

Las cadenas en c están terminadas en nulo, por lo que debe asignar espacio para el terminador de cadenas.

Para encajar una palabra de 10 caracteres, necesita asignar 11 bytes:

 char word[11] = { 0 }; 

Una cadena de 10 caracteres toma 11 caracteres para representar (1 extra para el byte nulo al final).