strcpy溢出char指针和char数组C

时间:2017-10-26 17:21:24

标签: c arrays pointers overflow

这是问题所在: 我有两个字符串s1和s2。我想编写一个函数来获取两个字符串中的一个,覆盖另一个字符串。

我可以使用此代码(C)执行此操作:

#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;
}

这是输出:

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(s1);
    printf("\n\nAfter s1 : %s s2 : %s", s1, s2);



    return EXIT_SUCCESS;
}

如果我评论此行strcpy((s + strlen(s) + 1 ), s); 这是输出:

s1 Adress -> 00405086
s2 Adress -> 0040508B

Before s1 : Name s2 : emaN

Adress where I want write -> 0040508B

After s1 : Name s2 : emaN

为什么第二个程序不起作用?

1 个答案:

答案 0 :(得分:0)

你了解指针和数组之间的区别吗?

第一种情况: 当你在数组边界外写字时,你有UB。但阵列在RW存储器中,你很幸运,没有得到SEGFAULT。

第二种情况 - 指向RO内存中字符串文字的指针。你不能写在那里,你得到即时错误

两个都错了!@!@ !!你需要一本好的C书