2017-10-26 17 views
0

これは問題です。 私は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のプログラムが動作しないのはなぜ?

+0

'char * s1 =" Name ";を使用しているので、変更不可能な領域に取り掛かっているので、 –

+1

FYI:あなたの' modifica_overflow() '関数は、標準 'strcat()' – Barmar

+1

これをチェックしてください! https://stackoverflow.com/questions/1455970/cannot-modify-c-string –

答えて

0

ポインタと配列の違いを理解していますか?

第1のケース: あなたはUBを、配列の境界外に書き込むときにそこに置いています。しかし配列はRWメモリにあり、あなたはSEGFAULTを取得しないほど十分に幸運でした。

ROメモリ内の文字列リテラルへのポインタです。そこに書き込むことはできません。すぐにエラーが発生します

どちらも間違っています@!@ !!最初に良いCの本が必要です

+0

私は両方が間違っていることを知っていますが、私は自主的に配列境界外に書きたいと思っています。これは単なるテストです。 Cはメモリ節約ではなく、私はこれを行うことができます。私は文字列リテラルが編集可能でないことを知っているだけです。 – Chuck94

+0

文字列リテラルは読み取り専用です。最初の場合、リテラルは配列にコピーされます –