使用指针

时间:2016-07-25 16:32:19

标签: c pointers memory-address

我是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的最佳类型是什么?

3 个答案:

答案 0 :(得分:2)

有几件事要知道:

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

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

    据我所知,你试图遍历内存地址并找到一个特定的值。从技术上讲,它是可能的,但除了少数罕见的情况之外,几乎没有理由这样做。

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

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

      

    有没有办法可以找出内存地址中存储的类型数据

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

答案 1 :(得分:1)

无法以通用便携方式执行您尝试的操作。当您访问未分配给您的内存时,代码会生成未定义的行为。

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

  

有没有办法可以找出存储器地址中存储的类型数据。

没有

答案 2 :(得分:0)

你正在伪造一个带有循环内部临时var的指针。 搜索值的正确方法是使用两个参数:要搜索的值,以及包含要搜索的值的集合(例如,数组)。