是否可能在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;
}
答案 0 :(得分:3)
没有。 C不支持异常,所以没有什么可以捕获的。您所看到的不是“错误的指针异常”,而是内存访问错误 - 无法从中恢复。
答案 1 :(得分:3)
您的代码中存在多个问题。这是其中一些列表:
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");
}
}