这是问题所在: 我有两个字符串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
为什么第二个程序不起作用?
答案 0 :(得分:0)
你了解指针和数组之间的区别吗?
第一种情况: 当你在数组边界外写字时,你有UB。但阵列在RW存储器中,你很幸运,没有得到SEGFAULT。
第二种情况 - 指向RO内存中字符串文字的指针。你不能写在那里,你得到即时错误
两个都错了!@!@ !!你需要一本好的C书