异常:使用 strcpy_s 时访问冲突写入位置
Exception: Access violation writing location when using strcpy_s
当我编译下面的代码时,我得到这个异常:
console.exe 中 0x0FA8E90F (ucrtbased.dll) 的未处理异常:0xC0000005:访问冲突写入位置 0xFFFFFFCD
void test()
{
char *type = malloc(sizeof(char) * 256);
strcpy_s(*type, 7,"Laptop");
}
我不得不提一下,我是使用动态实现和指针的初学者。我也不允许使用静态实现。
在上面的代码片段中,我还尝试了不同的实现方式:替换以下行:
strcpy_s(*type, 7,"Laptop");
这一行:
strcpy(*type, "Laptop");
但结果是一样的。对我的问题有什么建议吗?
提前致谢。
而不是 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 中 0x0FA8E90F (ucrtbased.dll) 的未处理异常:0xC0000005:访问冲突写入位置 0xFFFFFFCD
void test()
{
char *type = malloc(sizeof(char) * 256);
strcpy_s(*type, 7,"Laptop");
}
我不得不提一下,我是使用动态实现和指针的初学者。我也不允许使用静态实现。
在上面的代码片段中,我还尝试了不同的实现方式:替换以下行:
strcpy_s(*type, 7,"Laptop");
这一行:
strcpy(*type, "Laptop");
但结果是一样的。对我的问题有什么建议吗?
提前致谢。
而不是 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
给您相同结果的原因相同。