Проблема памяти C с символом * - PullRequest
0 голосов
/ 21 марта 2012

Мне нужна помощь с моим 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 ]

3 голосов
/ 21 марта 2012

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, когда вы закончите.В противном случае вы вызовете утечку.

3 голосов
/ 21 марта 2012

ты не имеешь в виду?

num[11] = val

Да, нет способа проверить, что это за пределами границ, кроме как сделать это самостоятельно, C не предоставляет никакого способа сделать это.Также обратите внимание, что массивы начинаются с нуля, поэтому num [10] также находится за пределами.

1 голос
/ 21 марта 2012

Стандарт определяет это как Неопределенное поведение .

Это может сработать, возможно, вы никогда не знаете, когда кодируете на C / C ++, убедитесь, что вы проверяете границы перед доступом к вашим массивам

0 голосов
/ 21 марта 2012

Полагаю, вы могли бы использовать sizeof, чтобы избежать доступа к вашему массиву из привязанного индекса. Но c позволяет вам получить доступ к некоторой памяти за пределами вашего массива. Это нормально для компилятора c, и ОС будет управлять поведением, когда вы это сделаете. C / C ++ на самом деле не выполняет никакой проверки границ в отношении массивов. От операционной системы зависит доступ к действительной памяти. Вы можете использовать массив следующим образом: имя типа [размер];

0 голосов
/ 21 марта 2012

Компиляторы Common C не будут выполнять проверку границ массивов.

Доступны некоторые компиляторы, которые утверждают, что поддерживают границы массивов - но их производительность, как правило, достаточно низкая по сравнению с обычными компиляторами, так как они обычно не распространяются по всей ширине.

Есть даже диалекты языка С, предназначенные для обеспечения безопасности памяти , но, опять же, они обычно не очень далеко зашли. (Связанный Cyclone, например, поддерживает только 32-битные платформы, в прошлый раз, когда я изучал его.)

Вы можете создавать свои собственные структуры данных для проверки границ, если хотите. Если вы поддерживаете структуру, которая включает указатель на начало ваших данных, элемент данных, который включает в себя выделенный размер, и функции, которые работают с этой структурой, вы можете реализовать все это. Но ответственность за предоставление этих структур данных лежит исключительно на вас или вашей среде.

0 голосов
/ 21 марта 2012

, если вы используете Visual Studio 2010 (или бета-версию 2011 года), она будет работать до тех пор, пока вы не попытаетесь освободить выделенную память.

есть расширенные инструменты для проверки утечки памяти.

в вашем примере вы действительно переместились в несанкционированное пространство памяти. ваши индексы должны быть от 0 до (включая) 999.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...