我的C代码需要帮助。我有一个函数,它将值设置为内存中的点 到您输入到函数的值。
我面临的问题是指针是否超出了分配的内存量 它应该抛出一个错误。我不知道如何检查这个问题。
unsignded char the_pool = malloc(1000);
char *num = a pointer to the start of the_pool up to ten spots
num[i] = val;
num[11] = val; //This should throw an error in my function which
那么如何检查我是否已进入未经授权的内存空间。
答案 0 :(得分:3)
不是吗?
num[11] = val
是的,没有办法检查它是否超出界限,除非自己动手,C无法做到这一点。另请注意,数组从零开始,因此num [10]也超出了界限。
答案 1 :(得分:3)
C不会为您捕获此错误。你必须自己做。
例如,您可以安全地在函数中包装对数组的访问:
typedef struct
{
char *data;
int length;
} myArrayType;
void MakeArray( myArrayType *p, int length )
{
p->data = (char *)malloc(length);
p->length = length;
}
int WriteToArrayWithBoundsChecking( myArrayType *p, int index, char value )
{
if ( index >= 0 && index < p->length )
{
p->data[index] = value;
return 1; // return "success"
}
else
{
return 0; // return "failure"
}
}
然后你可以查看WriteToArrayWithBoundsChecking()的返回值,看看你的写入是否成功。
当然,你必须记得在完成后清理myArrayType->data
指向的内存。否则会导致泄漏。
答案 2 :(得分:1)
标准将其定义为Undefined behavior。
在使用C / C ++进行编码时,它可能不会,您可能不会知道,确保在访问数组之前检查边界
答案 3 :(得分:0)
Common C编译器不会为你执行数组边界检查。
Some compilers are available that claim to support array bounds - 但与正常的编译器相比,它们的表现通常很差,因为它们通常不会分布得太远。
There are even dialects of C intended to provide memory safety,但同样,这些通常不会走得太远。 (例如,链接的Cyclone仅支持32位平台,上次我查看它。)
如果您愿意,您可以构建自己的数据结构以提供边界检查。如果您维护的结构包含指向数据开头的指针,包含已分配大小的数据成员以及对结构起作用的函数,则可以实现所有这些。但是,您或您的环境完全有责任提供这些数据结构。
答案 4 :(得分:0)
我猜你可以使用sizeof来避免你的数组访问超出绑定索引。但是c允许你从数组绑定中访问一些内存。这对c编译器来说没问题,操作系统会在你这样做时管理行为。 C / C ++实际上并没有对数组进行任何边界检查。这取决于操作系统,以确保您访问有效的内存。 你可以像这样使用数组: 类型名称[size];
答案 5 :(得分:-1)
如果您使用的是Visual Studio 2010(或2011 Beta),那么在您尝试释放已分配的内存后,它将一直存在。
有先进的工具来检查泄漏的内存。
在您的示例中,您确实已经移动到未经授权的内存空间。你的索引应该在0到(包括)999之间。