在动态数组上使用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]