例外:使用 strcpy_s 时访问冲突写入位置
Posted
技术标签:
【中文标题】例外:使用 strcpy_s 时访问冲突写入位置【英文标题】:Exception: Access violation writing location when using strcpy_s 【发布时间】:2018-03-12 18:38:56 【问题描述】:当我编译以下代码时,我得到了这个异常:
console.exe 中 0x0FA8E90F (ucrtbased.dll) 处未处理的异常:0xC0000005:访问冲突写入位置 0xFFFFFFCD
void test()
char *type = malloc(sizeof(char) * 256);
strcpy_s(*type, 7,"Laptop");
我不得不提一下,我是使用动态实现和指针的初学者。我也不允许使用静态实现。
在上面的 sn-p 中,我还尝试了不同的实现方式:替换以下行:
strcpy_s(*type, 7,"Laptop");
用这一行:
strcpy(*type, "Laptop");
但结果是一样的。对我的问题有什么建议吗?
提前谢谢你。
【问题讨论】:
这些类型的拼写错误通常可以被编译器捕捉到。确保您没有压制或忽略警告。 【参考方案1】:你想要strcpy_s(type, 7,"Laptop");
而不是strcpy_s(*type, 7,"Laptop");
strcpy_s
假定第一个参数是指向数据目的地的指针,根据签名:errno_t strcpy_s(_CHAR *_DEST, size_t _SIZE, const _CHAR *_SRC)
。
在您的代码中,您在将指针 type
传递给 strcpy_s
时取消了对它的引用,这就是问题所在。因为该函数需要 char *
作为第一个参数,所以当您传递 *type
而不是 type
时,就好像您传递了 char
,然后它被错误地解释为指针(内存位置)。当strcpy_s
尝试写入这个无效的内存位置时,它会抛出您看到的访问冲突异常。请注意,这与 strcpy
给出相同结果的原因相同。
【讨论】:
这适用于该异常。我修改了代码,但是当我再次尝试编译时,这次我在同一行得到了这个异常:console.exe has trigger a breakpoint. @PhyllisVance 你在用 Visual Studio 编译这个吗?断点也不例外,它是一种在调试时暂停给定行上的代码的方法。以上是关于例外:使用 strcpy_s 时访问冲突写入位置的主要内容,如果未能解决你的问题,请参考以下文章