我将第一个的内容复制到第二个
。我在他们两个上添加了WATCH。在Debug选项卡中,我发现了 复制原始字符串会被破坏,新的字符串也会被破坏 显示的大于其大小。
#include<stdio.h>
int main()
{
char a[10]="What?";
char b[2];
int i;
for(i=0;i<6;i++)
{
b[i]=a[i];
}
printf("This is %s",a);
printf("\n this is b now: ",b);
return 0;
}
我已附上截图。我拿了一串= 10号A = “什么?”然后我拿了一个字符串b [2]
为什么原始字符串会被破坏?指针是否已更改?但是我把它变成了一个不变的指针。它无法改变。
以下是我面临的问题的屏幕截图: https://www.dropbox.com/s/8xwxwb27qis8xww/sjpt.jpg
请帮助别人!!
答案 0 :(得分:3)
b
传递给printf
,%s
说明符需要null-terminated string,而b
很可能不会在此时以空值终止,这是另一种未定义的行为。此外,一个可以插入2个字节数组的以null结尾的字符串基本上只能有一个可打印字符,所以你不应该期望b
为“WH”。最好的情况是,如果你修复了复制,它只能是“W”,因为第二个字符将是一个终止字节(\0
)。如果你想要两个字符,要么将数组大小增加到3以允许空终止符,要么只是不使用C字符串并使用“%c%c”格式字符串打印出两个字节。
答案 1 :(得分:1)
你目前所做的事情非常不安全!它可能在Windows上出于一些荒谬的原因,但不要这样做!
C标准库具有处理字符串和内存的特殊功能,strcpy例如用于复制字符数组。我建议您了解有关字符串如何工作以及如何操作它们的更多信息。
答案 2 :(得分:1)
正如其他答案所指出的那样,你是在数组范围之外写的。原始字符串a会发生变化,因为它恰好位于内存中的b之后,如调试窗口中所示。
在循环之前,内存如下所示:
b a
|00|WHat?00000|
循环之后,内存如下所示:
b a
|WH|at?0?00000|
这解释了为什么
当然这是Vlad Lazarenko已经提到过的未定义行为,但它解释了编译器/ settings / version / etc的行为。
只有编译器才存在常量指针。它确保您无法显式操作其数据,但如果您有内存泄漏,则无法保证任何内容。