これは問題です。 私は2つの文字列s1とs2を持っています。私は、2つの文字列のうちの1つを他の文字列に上書きする関数を書きたい。charポインタとchar配列のstrcpyオーバーフローC
私は、このコード(C)でこれを行うことができます。
s1 Adress -> 0061FF2B
s2 Adress -> 0061FF26
Before s1 : Name s2 : emaN
Adress where I want write -> 0061FF2B
After s1 : emaN s2 : emaN
パーフェクト作品:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void modifica_overflow(char *s){
printf("\n\nAdress where I want write -> %p", (s + strlen(s) + 1));
strcpy((s + strlen(s) + 1), s);
return;
}
int main(void) {
char s1[] = "Name";
char s2[] = "emaN";
printf("\ns1 Adress -> %p", (void*)s1);
printf("\ns2 Adress -> %p ", (void*)s2);
printf("\n\nBefore s1 : %s s2 : %s", s1, s2);
modifica_overflow(s2);
printf("\n\nAfter s1 : %s s2 : %s", s1, s2);
return EXIT_SUCCESS;
}
これが出力されます!
しかし、これが出力され、私は、この行をコメントstrcpy((s + strlen(s) + 1), s);
場合は、このコードで私がクラッシュ
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void modifica_overflow(char *s){
printf("\n\nAdress where I want write -> %p", (s + strlen(s) + 1));
strcpy((s + strlen(s) + 1), s);
return;
}
int main(void) {
char *s1 = "Name";
char *s2 = "emaN";
printf("\ns1 Adress -> %p", (void*)s1);
printf("\ns2 Adress -> %p", (void*)s2);
printf("\n\nBefore s1 : %s s2 : %s", s1, s2);
modifica_overflow(s1);
printf("\n\nAfter s1 : %s s2 : %s", s1, s2);
return EXIT_SUCCESS;
}
を持っている:
s1 Adress -> 00405086
s2 Adress -> 0040508B
Before s1 : Name s2 : emaN
Adress where I want write -> 0040508B
After s1 : Name s2 : emaN
、第2のプログラムが動作しないのはなぜ?
'char * s1 =" Name ";を使用しているので、変更不可能な領域に取り掛かっているので、 –
FYI:あなたの' modifica_overflow() '関数は、標準 'strcat()' – Barmar
これをチェックしてください! https://stackoverflow.com/questions/1455970/cannot-modify-c-string –