数组中第一个索引处的C未知访问冲突

时间:2012-10-19 12:03:18

标签: c access-violation assign

下面我有一个构造给定字符串(str)的置换字符串的方法。 我真的不知道为什么,但有时在调试时我收到以下异常:

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

尝试在ret_str(ret_str [l] = elem [0])中的索引0处分配('u')

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的范围内所以出了什么问题? BTW:函数调用后字符串ret_str是空闲的。

更新: elem没有问题。原因是我分配了内存,而堆上没有剩余内存用于动态分配(由于大量内存泄漏),因此calloc返回了一个NULL指针。这就是错误发生的原因。

2 个答案:

答案 0 :(得分:1)

您需要检查元素是否为空。如果为null,则函数应返回错误代码。

答案 1 :(得分:0)

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没有初始化。