C如何检查内存地址是否仍在范围内
C how to check if a memory address is still in scope
我想知道是否可以检查变量是否仍在 c 的范围内,或者指针是否指向范围外的变量。我最终想要做的是检查指针,如果它们指向超出范围的变量,则通过调用 free 删除指针。所以如果你们能帮助我,我会非常高兴。谢谢大家的贡献。
编辑:
您也可以跳过结构部分,只需使用宏将指针设置为 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);
}
我想知道是否可以检查变量是否仍在 c 的范围内,或者指针是否指向范围外的变量。我最终想要做的是检查指针,如果它们指向超出范围的变量,则通过调用 free 删除指针。所以如果你们能帮助我,我会非常高兴。谢谢大家的贡献。
编辑: 您也可以跳过结构部分,只需使用宏将指针设置为 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);
}