Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用指针在内存中迭代_C_Pointers_Memory Address - Fatal编程技术网

C 使用指针在内存中迭代

C 使用指针在内存中迭代,c,pointers,memory-address,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

我是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
        }
    }
}
#包括
void main(){
int值=10;
发现(价值);
}
voidfind(int-value){//将根据哪个更好,将其更改为返回long或int数组
int*int指针;
对于(inti=40000;i<40400;i+=32){/*不确定我是这样还是那样做,
*起始值、结束值和条件
*只是为了测试的目的*/
int指针=(int*)i;
if(*intPointer==值){
printf(“found value”);//实际上将它存储到数组中
}
}
}
find方法很可能给我一个分段错误,因为地址没有存储int值。有没有办法找出存储在内存地址中的数据类型

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


另外,存储地址的最佳类型是
int
还是
long

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

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

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

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


有几件事需要马上知道:

  • 内存并不总是保证在物理上是连续的(即使内存模型看起来也是如此)
  • 会有帮助的,以及一般的
  • find方法很可能给我一个分段错误,因为地址没有存储int值

    根据我所能告诉你的,你正试图通过内存地址循环找到一个特定的值。从技术上讲这是可能的,但实际上除了少数罕见的情况外,没有理由这么做

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

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

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


    ,至少不是你想要的方式

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