在动态数组上使用 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()
我有一个关于以下代码的基本问题:
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 bys2
(including the terminating null character) into the array pointed to bys1
. [...]
然后,对于 "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()