c - 如何检查内存是否可访问?

标签 c memcpy

我正在尝试调试崩溃问题,其中 memcpy正在尝试访问不存在的内存位置并失败。以下是问题代码的简化版本:

void func_foo(int **a) {
   int *b, c;
   if (*a) {
       b = *a;
   }
   memcpy(&c, b, sizeof(int));//this crashes because address "b" is not accessible.
}

我的问题是:有没有办法在尝试 memcpy 之前检查内存是否可访问? ,或者是否有其他保护机制来防止这里崩溃?不会检查 **a在这种情况下也会导致崩溃?

最佳答案

没有可移植的方式来以编程方式测试指针是否指向有效的可访问内存。

这是高度推荐的做法的一个原因,即在指针指向的内存被释放和初始化时始终将指针设置为 NULL,因此您有一些可以测试的内容。
Would not checking **a cause a crash as well in this case?
正确,您在这里所做的就是将传入的值分配给本地,然后尝试访问它。如果本地不好,那是因为传入的值不好。垃圾进垃圾出。

要解决您提供的代码:

   if (*a) {
       b = *a;
   }
   memcpy(&c, b, sizeof(int));//you really shouldn't be executing this at all unless
                              // you're setting b, so it should be within the if check 
                              // and only executed after b=*a

关于c - 如何检查内存是否可访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16903713/

相关文章:

将 Base64 转换为 GMP 整数

c - write(socket, buff, length) 使崩溃

c - 如何在 Linux 上正确地将网络接口(interface)置于混杂模式

c++ - 如何使C++类在内存中具有特定的大小

OpenGL:为什么 glMapNamedBuffer() 返回 GL_INVALID_OPERATION?

c++ - memcpy 没有按预期进行

c++ - memcpy CString 到 char*

c++ - 合并两个已排序的链表

C:如何从未知大小的文本文件中仅输入 int 数据

将 unsigned long long 的最低字节复制到 C 中的数组