如何处理C程序(不是C ++)中的运行时内存分配错误指针错误?

时间:2014-08-12 07:05:03

标签: c pointers

是否可能在C语言中运行时坏指针异常?。

我正在使用以下编译器。

注意 Microsoft Visual C ++编译器

以下示例程序。

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <Windef.h>

typedef struct tagTest{
int i;
char *str;
}   Test, 
    FAR *LPTest, 
    FAR **LLPTEST;

 extern LLPTEST m;

 int main()
 {

  int i;

  LLPTEST m = NULL;

  m = (LLPTEST)malloc(sizeof(LLPTEST));

  // Here We Check m[0] memory allocated or not ?
  // example: if(m[0]), or if(m[0]->i) any other idea. here m[0] is CXX0030 error expression cannot be evaluated.

  /* allocate memory */
  for(i=0; i<10; i++)
  {
     m[i] = (LPTest) malloc(sizeof(Test));
     m[i]->i = i;
     m[i]->str = (char*) malloc(10*sizeof(char));
     m[i]->str = "Test";
 }

 return 0;
}

3 个答案:

答案 0 :(得分:3)

没有。 C不支持异常,所以没有什么可以捕获的。您所看到的不是“错误的指针异常”,而是内存访问错误 - 无法从中恢复。

答案 1 :(得分:3)

您的代码中存在多个问题。这是其中一些列表:

  • Don't cast the return of malloc
  • 对于m,您分配sizeof(LLPTEST)个字节,但您应该真正分配sizeof(LPTest)
  • 继续上一点,您只分配一个指针,因此只有m[0]有效,所有其他索引将导致您写出越界。你应该这样做。

    m = malloc(sizeof(LPTest) * 10);
    

    这一点是导致问题的原因,因为它会导致undefined behavior

  • 您为m[i]->str分配内存,但随后用指向字符串文字的指针覆盖该指针,从而丢失指向已分配内存的指针(即您有内存泄漏)

  • 继续上一点,因为m[i]->str现在指向一个字符串文字,而不是你自己分配的内容,你不能free这个指针
  • 没有错误检查,请记住malloc可能会失败

如果您事先不知道需要为m分配多少项,则可以使用realloc重新分配更大的尺寸。

答案 2 :(得分:0)

有些例外可以捕获MSVC是为了扩展语法。

#include <windows.h>
#include <stdio.h>

typedef struct tagTest{
    int i;
    char *str;
} Test;

int main(){
    Test *m;
    //m = malloc(sizeof(Test));//it can be avoided by examining whether NULL simply.
    m = NULL;//malloc is unable to allocate memory
    __try{
        m->i = 0;//exception occurs
        m->str = "Test";
    }
    __except(EXCEPTION_EXECUTE_HANDLER){
        if(EXCEPTION_ACCESS_VIOLATION==GetExceptionCode())
            puts("ACCESS VIOLATION");
        puts("EXCEPTION OCCURRED");
    }
}