【发布时间】:2012-06-22 19:04:31
【问题描述】:
有人知道这里会发生什么吗?
我明白了
Unhandled exception at 0x5081f508 (msvcr100d.dll) in myProgram.exe: 0xC0000005: Access violation writing location 0x041e0010.
在这一行:
fscanf(fp, " %lf %lf %lf\n", &vertices[i].x, &vertices[i].y, &vertices[i].z );
在运行我的程序时,但当我在调试模式 (Visual Studio 2010) 下单步执行时,一切正常; fscanf() 按预期读取文件。
异常实际上是在input.c的那一行抛出的:
#else /* _UNICODE */
_FASSIGN( longone-1, (char*)pointer , pFloatStr, (char)decimal, _loc_update.GetLocaleT());
#endif /* _UNICODE */
如果我没记错的话。而且我不知道这些关于 UNICODE 的 cmets 是什么意思,这正是我将它们包括在这里的原因。
其他信息
调用栈:
msvcr100d.dll!_fassign_l(int flag, char * argument, char * number, localeinfo_struct * plocinfo) Line 258 + 0x6 bytes C++
>msvcr100d.dll!_input_l(_iobuf * stream, const unsigned char * format, localeinfo_struct * plocinfo, char * arglist) Line 1281 + 0x21 bytes C++
msvcr100d.dll!vfscanf(int (_iobuf *, const unsigned char *, localeinfo_struct *, char *)* inputfn, _iobuf * stream, const char * format, localeinfo_struct * plocinfo, char * arglist) Line 61 + 0x13 bytes C
msvcr100d.dll!fscanf(_iobuf * stream, const char * format, ...) Line 99 + 0x18 bytes C
myProgram.exe!main(int argc, char * * argv) Line 166 + 0x49 bytes C++
myProgram.exe!__tmainCRTStartup() Line 555 + 0x19 bytes C
myProgram.exe!mainCRTStartup() Line 371 C
其他一些信息
该程序是关于使用 OpenGL 进行着色的,您在 fscanf() 调用中看到的 vertices 是以下数组:
typedef struct _Vertex {
double x, y, z;
int polygonsThisPartOf; // Number of polygons this vertex is a part of
Point normal;
} Vertex;
在我的程序的第一个版本中,vertices 是一个数组数组,一切正常;在我修改代码以使用vertices 作为上述structs 的数组后,此异常开始发生。
数组的分配
// ˇ THIS is the mistake
vertices = (Vertex *) malloc(vcount * sizeof(Vertex *));
if (vertices == NULL) exit(-2);
vcount 是正确的。
【问题讨论】:
-
你能把它归结为minimal test case吗?即出现此问题的 10 行程序?
-
向我们展示你是如何初始化
vertices的。 -
@Bloke - 换句话说(正如我在回复中暗示的那样),我们不知道您是否在开始将数据读入数组之前成功地为数组分配空间。我希望我下面的建议对您有所帮助...
-
分配顶点数组的代码是什么样的?
-
对,分配。对不起,就这样吧。检查编辑。
标签: c struct access-violation scanf