【问题标题】:C unknown access violation at first index in array数组中第一个索引处的 C 未知访问冲突
【发布时间】:2012-10-10 01:07:27
【问题描述】:

下面我有一个构造给定字符串(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 范围内,所以有什么问题? 顺便说一句:字符串 ret_str 在函数调用后被释放。

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

【问题讨论】:

  • 如果我是你,我会检查 ret_str 和 elem 是否不为 NULL ;)
  • 它告诉你 ret_str 为空。想想为什么会这样。
  • 这意味着 calloc 没有分配内存。在这种情况下,Elem 不为 NULL...
  • 错误的根本原因很可能在于elem引用的内存。
  • elem 没有问题。原因是我分配了内存,而堆上没有用于动态分配的内存(由于大量内存泄漏),所以 calloc 返回了一个 NULL 指针。这就是发生错误的原因。

标签: c access-violation assign


【解决方案1】:

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

【讨论】:

  • 写入时出错,所以它必须是 ret_str 而不是 elem。
  • 在 C 中,使用 malloc/calloc 时最好不要使用显式类型转换。
  • 不,它既不可取也没有必要。使用“malloc”也存在某些问题
  • @askmish stackoverflow.com/questions/4993327/… 阅读此内容以了解为什么它不喜欢类型转换 malloc。
  • 我想说OP的代码中calloc或malloc没有问题。
【解决方案2】:

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

【讨论】:

  • 如果不是NULL elem 肯定指向不属于进程的内存。
  • elem 没有问题。原因是我分配了内存,而堆上没有用于动态分配的内存(由于大量内存泄漏),所以 calloc 返回了一个 NULL 指针。这就是发生错误的原因。
猜你喜欢
  • 2016-03-26
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
相关资源
最近更新 更多