Điều gì có thể là lý do có thể cho việc này và làm cách nào để khắc phục?
Một kịch bản sẽ là trong ví dụ sau:
#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--;
}
}
Trong chương trình này, bạn có thể đảo ngược một chuỗi hoặc một phần của chuỗi nếu bạn ví dụ gọi reverse()
với một cái gì đó như thế này:
reverse(arr + 2);
Nếu bạn quyết định chuyển độ dài của mảng như sau:
#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--;
}
}
Hoạt động tốt.
Nhưng khi bạn làm điều này:
revSTR(arr + 2, len);
Bạn nhận được:
==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)
Và điều này xảy ra bởi vì trong các mã đầu tiên, chiều dài của arr
được kiểm tra bên trong revSTR()
đó là tốt, nhưng trong mã thứ hai nơi bạn vượt qua độ dài:
revSTR(arr + 2, len);
chiều dài bây giờ dài hơn chiều dài thực sự bạn vượt qua khi bạn nói arr + 2
.
Độ dài strlen (arr + 2)
! = strlen (arr)
.
Bạn có thể xác định những phần nào trong mã của bạn khiến cho ngăn xếp đập và đăng lên không? Sau đó, chúng tôi có thể sẽ chỉ ra chính xác lý do tại sao nó xảy ra và cách sửa nó. –