C неизвестное нарушение прав доступа по первому индексу в массиве

Ниже у меня есть метод, который создает переставленную строку заданной строки (str). Я действительно не знаю, почему, но иногда во время отладки я получаю следующее исключение:

Unhandled exception at 0x01282665 in test.exe: 0xC0000005: Access violation 
writing     location 0x00000000.

при попытке присвоить ('u') индекс 0 в ret_str (ret_str[l]=elem[0])

unsigned char* getPermStr(long length,unsigned char* strt,unsigned char* elem){
    unsigned char* ret_str;
    long l = 0;
    ret_str = (unsigned char*) calloc(length,sizeof(unsigned char));
    while(l < length){
        if(elem < (strt+length-1)){
            ret_str[l]=elem[0];  // ACCESS VIOLATION HERE
            elem+=1;
        }else{
            ret_str[l]=elem[0];
            elem = strt;
        }
        l+=1; 
    }
    return ret_str;
}

Я не понимаю, почему происходит нарушение прав доступа... Я нахожусь в пределах своего ret_str, так что же не так? Кстати: строка ret_str освобождается после вызова функции.

ОБНОВЛЕНИЕ: с elem проблем не было. Причина заключалась в том, что я выделил память, когда в куче не осталось памяти для динамического выделения (из-за большого количества утечек памяти), поэтому calloc вернул указатель NULL. Вот почему произошла ошибка.


person user1745184    schedule 19.10.2012    source источник
comment
На вашем месте я бы проверил, не равны ли ret_str и elem NULL;)   -  person Anthony Teisseire    schedule 19.10.2012
comment
Он говорит вам, что ret_str имеет значение null. Подумайте, почему это может быть.   -  person Paul Tomblin    schedule 19.10.2012
comment
Это означает, что calloc не выделил память. Elem не NULL в этом случае...   -  person user1745184    schedule 19.10.2012
comment
Корень ошибки, скорее всего, лежит в памяти, на которую ссылается elem.   -  person alk    schedule 19.10.2012
comment
С элем проблем не было. Причина заключалась в том, что я выделил память, когда в куче не осталось памяти для динамического выделения (из-за большого количества утечек памяти), поэтому calloc вернул указатель NULL. Вот почему произошла ошибка.   -  person user1745184    schedule 20.10.2012


Ответы (2)


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

person Lajos Arpad    schedule 19.10.2012
comment
Если не NULL, то elem наверняка указывает на память, не принадлежащую процессу. - person alk; 19.10.2012
comment
С элем проблем не было. Причина заключалась в том, что я выделил память, когда в куче не осталось памяти для динамического выделения (из-за большого количества утечек памяти), поэтому calloc вернул указатель NULL. Вот почему произошла ошибка. - person user1745184; 20.10.2012

ret_str = (unsigned char*) calloc(length,sizeof(unsigned char)); Измените эту строку на

ret_str = malloc(length * sizeof(unsigned char));
if(ret_str == NULL){ return "" ;}
//--whatever
while(l < length){
        if(elem < (strt+length-1)){
            ret_str[l]=elem[0];  // ACCESS VIOLATION HERE
            elem+=1;
        }else{
            ret_str[l]=elem[0];
            elem = strt;
        }
        l+=1; 
    }

Также убедитесь, что elem доступен. Скорее всего, elem не инициализирован.

person Aniket Inge    schedule 19.10.2012
comment
Это дает ошибку при записи, поэтому это должно быть ret_str, а не elem. - person Paul Tomblin; 19.10.2012
comment
В C предпочтительно не использовать явное приведение типов при использовании malloc/calloc. - person askmish; 19.10.2012
comment
нет, это не желательно и не нужно. Также есть определенные проблемы с использованием malloc - person Aniket Inge; 19.10.2012
comment
@askmish stackoverflow.com/questions/4993327/ прочтите это, чтобы узнать, почему его не предпочитают приводить к типу malloc. - person Aniket Inge; 19.10.2012
comment
Я хотел сказать, что в коде OP нет проблем с calloc или malloc. - person askmish; 19.10.2012
comment
@askmish очевидно, что он не проверяет NULL. Кроме этого, похоже, что с кодом НЕТ проблем. Вы думаете, он что-то скрывает? - person Aniket Inge; 19.10.2012