我对以下代码有一个基本问题:
int main() {
char *sNext1="DABCD";
char Tmp[]="";
strcpy(Tmp, sNext1);
return 0;
}
" strcpy"发生错误当我运行它。似乎它不允许我将字符串复制到动态数组中。有谁知道导致此错误的原因是什么?我该如何解决?
答案 0 :(得分:4)
这里的问题是
char Tmp[]="";
这里,Tmp
不是一个动态数组,它是一个完全一个元素的数组(通过初始化程序初始化)。当您将其用作strcpy()
的目标时,您将超出缓冲区。基本上,您的代码尝试访问超出范围的内存,这会调用undefined behavior。
相关,引用C11
,章节§7.24.2.3, strcpy()
,强调我的
strcpy
函数复制s2
指向的字符串(包括终止空值) 字符)到s1
指向的数组中。 [...]
然后,对于“字符串函数约定”,§7.24.1,
[....]如果在对象末尾之外访问数组,则行为未定义。
解决方案:您需要确保Tmp
有足够的内存来保存要复制到其中的内容,包括空终止符。
也就是说,对于托管环境,int main()
至少应该int main(void)
符合标准。
答案 1 :(得分:1)
在将字符串复制到Tmp
之前,将内存分配给Tmp
。
Tmp
是一个大小为1的字符数组。
动态分配内存,如下所示。 (如果您尝试进行动态内存分配)
char *Tmp = malloc(strlen(sNext1) + 1);
然后尝试strcpy()