¿Cuáles podrían ser las posibles razones para esto y cómo lo rectifico?
Un escenario sería en el siguiente ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap (char *a , char *b);
void revSTR (char *const src);
int main (void){
char arr[] = "A-B-C-D-E";
revSTR(arr);
printf("ARR = %s\n", arr);
}
void swap (char *a , char *b){
char tmp = *a;
*a = *b;
*b = tmp;
}
void revSTR (char *const src){
char *start = src;
char *end = start + (strlen(src) - 1);
while (start < end){
swap(&(*start) , &(*end));
start++;
end--;
}
}
En este programa se puede revertir una cadena o una parte de la cadena si, por ejemplo, la llamada reverse()
con algo como esto:
reverse(arr + 2);
Si decide pasar a la longitud de la matriz de esta manera:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap (char *a , char *b);
void revSTR (char *const src, size_t len);
int main (void){
char arr[] = "A-B-C-D-E";
size_t len = strlen(arr);
revSTR(arr, len);
printf("ARR = %s\n", arr);
}
void swap (char *a , char *b){
char tmp = *a;
*a = *b;
*b = tmp;
}
void revSTR (char *const src, size_t len){
char *start = src;
char *end = start + (len - 1);
while (start < end){
swap(&(*start) , &(*end));
start++;
end--;
}
}
Funciona bien también.
Pero al hacer esto:
revSTR(arr + 2, len);
Usted consigue llegar:
==7125== Command: ./program
==7125==
ARR = A-
*** stack smashing detected ***: ./program terminated
==7125==
==7125== Process terminating with default action of signal 6 (SIGABRT)
==7125== at 0x4E6F428: raise (raise.c:54)
==7125== by 0x4E71029: abort (abort.c:89)
==7125== by 0x4EB17E9: __libc_message (libc_fatal.c:175)
==7125== by 0x4F5311B: __fortify_fail (fortify_fail.c:37)
==7125== by 0x4F530BF: __stack_chk_fail (stack_chk_fail.c:28)
==7125== by 0x400637: main (program.c:14)
Y esto sucede porque en el primer código, la longitud de arr
está marcada en el interior de revSTR()
lo cual está bien, pero en el segundo código donde se pasa la longitud:
revSTR(arr + 2, len);
la longitud ahora es más larga que la longitud real que pasa cuando dice arr + 2
.
Longitud de strlen (arr + 2)
! = strlen (arr)
.
¿Podría identificar qué partes de su código hacen que la pila se rompa y lo publique? Entonces, probablemente podamos señalar exactamente por qué sucede y cómo corregirlo. –