Was könnten die möglichen Gründe dafür sein und wie behebe ich es?
Ein Szenario, in dem folgenden Beispiel wäre:
#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--;
}
}
In diesem Programm können Sie einen String oder einen Teil der Zeichenfolge umkehren können, wenn Sie zum Beispiel Anruf reverse()
mit etwas wie folgt aus:
reverse(arr + 2);
Wenn Sie sich entscheiden, die Länge des Array wie folgt weitergeben müssen:
#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--;
}
}
Funktioniert auch gut.
Aber wenn Sie dies tun:
revSTR(arr + 2, len);
Sie erhalten erhalten:
==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)
Und dies geschieht, weil in dem ersten Code, die Länge von arr
innerhalb von revSTR()
geprüft, was in Ordnung ist, aber in dem zweiten Code, in dem Sie die Länge übergeben:
revSTR(arr + 2, len);
Die Länge ist jetzt länger als die tatsächliche Länge, die Sie überschreiten, wenn Sie
arr + 2
sagen.
Länge von strlen (arr + 2)
! = strlen (arr)
.
Könntest du vielleicht herausfinden, welche Teile deines Codes den Stapel zerstören und ihn veröffentlichen? Dann werden wir wahrscheinlich genau feststellen können, warum es passiert und wie wir es korrigieren können. –