例外:使用 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 时访问冲突写入位置的主要内容,如果未能解决你的问题,请参考以下文章

写入位置0x00460000时发生访问冲突,这是啥原因?

写入位置时访问冲突

使用 log4cpp 时访问冲突写入位置

opencv中的访问冲突写入位置

memcpy():访问冲突写入位置

0xC0000005: 写入位置 0x0000000002450040 时发生访问冲突