在动态数组上使用 strcpy

Using strcpy on a dynamic array

我有一个关于以下代码的基本问题:

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

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

这里的问题是

 char Tmp[]="";

这里,Tmp不是一个动态数组,它是一个恰好一个元素的数组(通过初始化器初始化).当您将其用作 strcpy() 的目标时,您将超出缓冲区。基本上,您的代码会尝试访问超出限制的内存,这会调用 undefined behavior.

相关,引用C11,章节§7.24.2.3,strcpy()强调我的

The strcpy function copies the string pointed to by s2 (including the terminating null character) into the array pointed to by s1. [...]

然后,对于 "String function conventions",§7.24.1,

[....] If an array is accessed beyond the end of an object, the behavior is undefined.

解决方法:需要保证Tmp有足够的内存容纳要复制进去的内容,包括空终止符。

也就是说,对于托管环境,int main() 至少应 int main(void) 才能符合标准。

在将字符串复制到 Tmp 之前分配内存给 Tmp

Tmp 是一个大小为 1 的字符数组。

如下所示动态分配内存。 (如果您尝试进行动态内存分配)

char *Tmp = malloc(strlen(sNext1) + 1);

然后尝试strcpy()