【发布时间】:2019-01-25 15:53:06
【问题描述】:
我不明白为什么 str1 会在这里发生变化。请帮忙。
#include<stdio.h>
#include<string.h>
int main (){
char str1[]="stackoverflowwwwwww";//str1
char str2[] = "stackoverflow";
char str3[40];
char str4[40];
char str5[] = "asdfgh";
strcpy(str2, str1);
strcpy(str3, "successful");
strcpy(str4, str5);
printf("str1: %s\nstr2: %s\nstr3:%s\nstr4:%s\n", str1, str2, str3, str4);
return 0;
}
输出是:
str1: www
str2: stackoverflowwwwwww
str3: successful
str4: asdfgh
为什么str1 在这里变了?
【问题讨论】:
-
您正在调用未定义的行为。
strcpy(str2, str1);目标缓冲区有多大?你的问题的答案就是那个问题的答案。 -
@Cplusminus_is_coming 你能用它的规范引用来支持这个期望吗(例如en.cppreference.com/w/c/string/byte/strcpy)?或者您是否正在考虑使用适当参数的 strncpy?
-
能否提供您环境中地址差异str1-str2的值?要么使用调试器,要么打印指针值。
-
如果您真的很好奇为什么会发生这种情况在您的特定情况下,请使用您的调试器。就语言而言,没有已定义的原因。一旦调用未定义的行为,您就离开了该保留的安全性。
-
使用
[40]而不是[].strcpy足够安全
标签: c