【问题标题】:C memory issue with char*char* 的 C 内存问题
【发布时间】:2012-03-21 00:28:28
【问题描述】:

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

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

【问题讨论】:

  • 那甚至无法编译,而确保不超出缓冲区的方法是跟踪大小。
  • 对不起,我没有提供一切。我已经创建了一个更大的内存池,我将使用它。我将指向小块的指针并将其设置为值

标签: c memory memory-management memory-leaks


【解决方案1】:

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-&gt;data指向的内存。否则会导致泄漏。

【讨论】:

    【解决方案2】:

    你不是说吗?

    num[11] = val
    

    是的,除了自己做之外,没有办法检查它是否超出界限,C 没有办法做到这一点。另请注意,数组从零开始,因此 num[10] 也超出了界限。

    【讨论】:

      【解决方案3】:

      标准将其定义为Undefined behavior

      它可能有效,也可能无效,你永远不知道,在使用 C/C++ 编码时,请确保在访问数组之前检查边界

      【讨论】:

        【解决方案4】:

        普通 C 编译器不会为您执行数组边界检查。

        Some compilers are available that claim to support array bounds -- 但与普通编译器相比,它们的性能通常很差,因此它们通常分布不广。

        There are even dialects of C intended to provide memory safety,但同样,这些通常不会走得太远。 (例如,链接的 Cyclone 只支持 32 位平台,我上次研究过。)

        如果您愿意,您可以构建自己的数据结构来提供边界检查。如果您维护的结构包含指向数据开头的指针、包含分配大小的数据成员以及在该结构上工作的函数,您就可以实现所有这些。但提供这些数据结构的责任完全在于您或您的环境。

        【讨论】:

          【解决方案5】:

          我猜你可以使用 sizeof 来避免你的数组访问超出绑定索引。但是 c 允许您访问数组边界之外的一些内存。这对 c 编译器来说没问题,当你这样做时,操作系统会管理行为。 C/C++ 实际上并没有对数组进行任何边界检查。这取决于操作系统来确保您访问的是有效内存。 你可以像这样使用数组: 类型名称[大小];

          【讨论】:

            【解决方案6】:

            如果您使用的是 Visual Studio 2010(或 2011 Beta 版),它会在您尝试释放分配的内存后等待您。

            有高级工具可以检查内存泄漏。

            在您的示例中,您实际上确实移动到了未经授权的内存空间。您的索引应该在 0 到(包括)999 之间。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2010-11-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-22
              相关资源
              最近更新 更多