在动态数组上使用strcpy

时间:2016-10-26 07:49:14

标签: c arrays string pointers strcpy

我对以下代码有一个基本问题:

int main() {
    char *sNext1="DABCD";
    char Tmp[]="";
    strcpy(Tmp, sNext1);
    return 0;
}

" strcpy"发生错误当我运行它。似乎它不允许我将字符串复制到动态数组中。有谁知道导致此错误的原因是什么?我该如何解决?

2 个答案:

答案 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()