【问题标题】:Iterate through memory using pointers [closed]使用指针遍历内存[关闭]
【发布时间】:2016-11-29 02:39:12
【问题描述】:

我是 C 新手;我对 Java 有更多的背景知识。 我想尝试使用指针在内存中搜索值

#include <stdio.h>

void main(){

    int value = 10;
    find(value);
}

void find(int value){ // will change this to return array of long or int depending on which is better

int* intPointer;

    for(int i = 40000; i <  40400  ; i+= 32){ /* not sure if i do it like this or another way,
                                               * the starting value, ending value and condition
                                               * is just for testing purpose */

        intPointer = (int*)i;

        if(*intPointer == value){
           printf("found value"); //will actually be storing it to an array instead
        }
    }
}

find 方法很可能给我一个分段错误,因为地址不存储 int 值。有没有办法可以找出内存地址中存储的数据类型。

有没有更好的方法来完成类似的任务?请解释并展示。实际的程序不会有int value = ??,而是只会使用 find 方法来获取包含该值的地址数组。

另外,存储地址intlong 的最佳类型是什么?

【问题讨论】:

  • 您可以调用未定义的行为。结果将取决于系统,如果操作系统禁止访问该地址,则访问该地址将导致您的程序被操作系统杀死。您编写了void main(),因此您可能希望在微控制器等独立环境中执行此代码(但那里可能不支持printf())。请注意,无论如何使用未声明的函数都是不好的。
  • 您正在访问未分配的内存:这是 C/C++ 中未定义的行为,因此您无法以这种方式检查内存。顺便说一句,int 的大小取决于实现:您应该使用 sizeof(int)*8 而不是 32 来增加循环。你为什么要在第一时间这样做?也许我们可以为您提供其他方式
  • 存储地址的最佳类型是指针(指向适当的类型)。 intlong 可能有也可能没有兼容的表示和足够的大小。
  • 你的问题有很多问题,我什至不知道从哪里开始。这不是记忆的工作方式。您遇到了段错误,因为您访问了您无权访问的内存。
  • @MikeCAT 我不知道 void 或返回 0 有很大的不同,我对 C 完全陌生,我只是在尝试一个带有指针的简单应用程序。

标签: c pointers memory-address


【解决方案1】:

马上要知道的几件事:

  1. 内存并不总是保证在物理上是连续的(即使内存模型看起来是这样的)。
  2. Knowing what a segfault is 以及 segmented memorymemory protection 的一般含义会有所帮助

find 方法很可能给我一个分段错误,因为地址不存储 int 值

据我所知,您正在尝试遍历内存地址并找到特定值。从技术上讲这是可能的,但实际上除了极少数情况外,没有理由这样做。

不幸的是(出于您的目的)您选择的操作系统相当智能地处理内存;它不只是将给定的所有内容按线性顺序排列,而是将(或)内存划分为它们自己的地址空间,以防止进程 A 的内存干扰进程 B 的内存,依此类推。为了跟踪哪些进程在内存中的位置,使用了映射机制。

您试图访问程序指定段之外的内存。为了能够做你想做的事,你需要找到一种从操作系统获取内存映射的方法。

有什么方法可以找出内存地址中存储的是什么类型的数据

No,至少不是你想要的方式。 A couple SO answers address this.

【讨论】:

    【解决方案2】:

    没有办法以通用的可移植方式来做您尝试的事情。当您访问未分配给您的内存时,代码会生成未定义的行为。

    在简单的嵌入式系统上是可能的。首先,您需要全面了解系统内存布局以及编译器的工作原理。例如,您必须知道int 在内存中是否总是4 字节对齐,RAM 的开始/结束地址。如果 MMU 存在且处于活动状态,您还需要知道它是如何工作的。

    有什么方法可以找出内存地址中存储的是什么类型的数据。

    没有

    【讨论】:

      【解决方案3】:

      您正在使用循环内的临时变量伪造指针。 搜索值的正确方法是使用两个参数:要搜索的值和包含要搜索的一些值的集合(例如数组)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-19
        • 2023-02-13
        • 2021-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多