在动态数组上使用strcpy
我有一个关于以下代码的基本问题:在动态数组上使用strcpy,c,arrays,string,pointers,strcpy,C,Arrays,String,Pointers,Strcpy,我有一个关于以下代码的基本问题: int main() { char *sNext1="DABCD"; char Tmp[]=""; strcpy(Tmp, sNext1); return 0; } 运行strcpy时,“strcpy”中发生错误。它似乎不允许我将字符串复制到动态数组中。有人知道是什么导致了这个错误吗?我该如何修复它呢?这里的问题是 char Tmp[]=""; 这里,Tmp不是一个动态数组,它是一个只有一个元素的数组(通过初始值设定项初始化
int main() {
char *sNext1="DABCD";
char Tmp[]="";
strcpy(Tmp, sNext1);
return 0;
}
运行strcpy时,“strcpy”中发生错误。它似乎不允许我将字符串复制到动态数组中。有人知道是什么导致了这个错误吗?我该如何修复它呢?这里的问题是
char Tmp[]="";
这里,Tmp
不是一个动态数组,它是一个只有一个元素的数组(通过初始值设定项初始化)。当您将此用作strcpy()的目标时,您正在溢出缓冲区。基本上,您的代码尝试访问超出限制的内存,这将调用
相关,引用章节§7.24.2.3中的C11
,strcpy()
strcpy
函数复制由s2
指向的字符串(包括终止null
字符)插入到由s1
指向的数组中。[……]
然后,对于“字符串函数约定”§7.24.1
[…]如果在对象末尾之外访问数组,则行为未定义
解决方案:您需要确保Tmp
有足够的内存来保存要复制到其中的内容,包括空终止符
也就是说,对于托管环境,intmain()
至少应该是intmain(void)
才能符合标准。这里的问题是
char Tmp[]="";
这里,Tmp
不是一个动态数组,它是一个只有一个元素的数组(通过初始值设定项初始化)。当您将此用作strcpy()的目标时,您正在溢出缓冲区。基本上,您的代码尝试访问超出限制的内存,这将调用
相关,引用章节§7.24.2.3中的C11
,strcpy()
strcpy
函数复制由s2
指向的字符串(包括终止null
字符)插入到由s1
指向的数组中。[……]
然后,对于“字符串函数约定”§7.24.1
[…]如果在对象末尾之外访问数组,则行为未定义
解决方案:您需要确保Tmp
有足够的内存来保存要复制到其中的内容,包括空终止符
也就是说,对于托管环境,int main()
至少应该是int main(void)
,以符合标准。在将字符串复制到Tmp
之前,将内存分配给Tmp
Tmp
是大小为1的字符数组
动态分配内存,如下所示。(如果您尝试执行动态内存分配)
然后在将字符串复制到Tmp
之前,尝试执行strcpy()
Tmp
是大小为1的字符数组
动态分配内存,如下所示。(如果您尝试执行动态内存分配)
然后试着做strcpy()
你认为Tmp
有足够的内存来保存你的字符串吗?@andy请不要;t添加谢谢你
,同样,它被删除是为了一个原因。:)你认为Tmp
有足够的内存来容纳你的字符串吗?@andy请不要;t添加谢谢你
,同样,它被删除是为了一个原因。:)或者使用VLA:chartmp[strlen(sNext1)+1]代码>或使用VLA:字符Tmp[strlen(sNext1)+1]代码>