C如何检查内存地址是不是仍在范围内[关闭]

Posted

技术标签:

【中文标题】C如何检查内存地址是不是仍在范围内[关闭]【英文标题】:C how to check if a memory address is still in scope [closed]C如何检查内存地址是否仍在范围内[关闭] 【发布时间】:2022-01-15 23:34:10 【问题描述】:

我想知道是否可以检查变量是否仍在 c 中的范围内,或者指针是否指向超出范围的变量。我最终想要做的是检查指针,如果它们指向超出范围的变量,然后通过调用 free 删除指针。所以如果你们能帮助我,我会非常高兴。谢谢大家的贡献。

【问题讨论】:

在悬空指针上调用free 会调用未定义的行为。不,没有真正的方法来检查指针是否指向有效对象(或已释放的内存) 超出范围是什么意思?它的值(地址)不指向用户分配的变量?如果您只有一个随机指针并想检查它是否指向一个变量,那么除非您在为其分配变量地址时手动跟踪它,否则没有办法做到这一点,例如。具有实际指针变量和 int 的结构,当您为该指针分配地址时,该结构仅包含 0 或 1。 如果您打算使用free,那么这是使用malloc 分配的内存,并且始终在“范围内”。 回答:不,这是不可能的。期间。 XY 问题。小心简单的程序。 【参考方案1】:

编辑: 您也可以跳过结构部分,只需使用宏将指针设置为 NULL,然后使用宏检查它是否为 NULL;

void some_function(int* input)

    if (CHECK_POINTER(input))
    
        *input = 50;
    

;


int main()

    
    int* point ;
    CLEAR_POINTER(point);
    int a=-1;
    

    some_function(point);
    printf("%d\n", a);

    ASSIGN_POINTER(point, &a);
    some_function(point);
    printf("%d\n", a);


旧: 如果您试图跟踪指针是否已分配给某个变量,您可以使用一个结构,该结构包含指针变量本身以及当指针已分配给某个变量时为 0 或 1 的变量。

然后您可以使用宏来分配指针、清除指针或检查指针是否分配了变量地址;

#include <stdio.h>

#define DEFINE_POINTER_DATA_STRUCTURE(data_type)\
typedef struct \
 \
    int is_assigned; \
    data_type *pointer; \
PDS_##data_type;

#define POINTER_DATA_STRUCTURE(data_type) PDS_##data_type

// The above allows you to have custom types


DEFINE_POINTER_DATA_STRUCTURE(int) // Define a struct of int pointer


#define ASSIGN_POINTER(structure, address) structure.pointer = address; structure.is_assigned = 1;

#define CLEAR_POINTER(structure) structure.pointer = 0x00; structure.is_assigned = 0;

#define CHECK_POINTER(structure)    structure.is_assigned

#define GET_POINTER(structure)  structure.pointer


void some_function(POINTER_DATA_STRUCTURE(int) input)

    if (CHECK_POINTER(input))
    
        *GET_POINTER(input) = 50;
    

;


int main()

    
    POINTER_DATA_STRUCTURE(int) pointer_structure;
    CLEAR_POINTER(pointer_structure);
    int a=-1;
    

    some_function(pointer_structure);
    printf("%d\n", a);

    ASSIGN_POINTER(pointer_structure, &a);
    some_function(pointer_structure);
    printf("%d\n", a);


【讨论】:

我看不到这提供了什么通过使用指针并明确检查它是否是NULL

以上是关于C如何检查内存地址是不是仍在范围内[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C++ 仅读取进程范围内的内存地址

linux下进程内存布局及变量存储位置检查

如何检查一个IP地址是不是在PHP中的两个IP范围内?

检查 IP 地址是不是在范围/子网内的标准/安全方法

[使用硬件内存保护在64位硬件上检查数组范围

是否可以关闭此功能以允许不同的程序通过 C 的内存地址访问同一块?