char *的C内存问题

时间:2012-03-21 00:28:29

标签: c memory memory-management memory-leaks

我的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 

那么如何检查我是否已进入未经授权的内存空间。

6 个答案:

答案 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之间。