我正在使用 Dr. Memory 对我今天写的一个 C 程序进行内存调试。使用 MinGW 的 gcc 编译的这个程序只有在我从调试器 gdb 运行它时才有效,所以我假设它是内存错误。内存博士返回给我的 results.txt 文件类似于:
Dr. Memory version 1.5.0 build 5 builton Aug 31 2012 16:19:51
Application cmdline: ""c:\Users\Lincoln\Desktop\USACO\gift1.exe""
Recorded 63 suppression(s) from default c:\Program Files\Dr. Memory/bin/suppress-default.txt
Error #1: UNINITIALIZED READ: reading register eflags
# 0 replace_memcmp [d:\derek\drmemory\withwiki\trunk\drmemory\replace.c:557]
# 1 parseInputs [c:\Users\Lincoln\Desktop\USACO/gift1.c:55]
# 2 main [c:\Users\Lincoln\Desktop\USACO/gift1.c:126]
Note: @0:00:00.473 in thread 3824
Note: instruction: jnz $0x7388a607
Error #2: UNINITIALIZED READ: reading register eax
# 0 parseInputs [c:\Users\Lincoln\Desktop\USACO/gift1.c:55]
# 1 main [c:\Users\Lincoln\Desktop\USACO/gift1.c:126]
Note: @0:00:00.473 in thread 3824
Note: instruction: test %eax %eax
Error #3: UNINITIALIZED READ: reading register esi
# 0 replace_memcmp [d:\derek\drmemory\withwiki\trunk\drmemory\replace.c:556]
# 1 parseInputs [c:\Users\Lincoln\Desktop\USACO/gift1.c:55]
# 2 main [c:\Users\Lincoln\Desktop\USACO/gift1.c:126]
Note: @0:00:00.474 in thread 3824
Note: instruction: movzx (%esi,%ecx,1) -> %edi
Error #4: UNADDRESSABLE ACCESS: reading 0x00000004-0x00000005 1 byte(s)
# 0 replace_memcmp [d:\derek\drmemory\withwiki\trunk\drmemory\replace.c:556]
# 1 parseInputs [c:\Users\Lincoln\Desktop\USACO/gift1.c:55]
# 2 main [c:\Users\Lincoln\Desktop\USACO/gift1.c:126]
Note: @0:00:00.474 in thread 3824
Note: instruction: movzx (%esi,%ecx,1) -> %edi
我不知道如何阅读这篇文章,也不知道从哪里开始尝试修复我的程序。这些错误消息是什么意思,我该如何解决?
编辑:这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
struct personsData {
char * name;
int accountMoney, receivedMoney, numAquaintances;
};
void parseInputs( FILE * fin, int NP, struct personsData * person ) {
int i;
for ( i = 0; i < NP; i ++ )
fscanf( fin, "%s", person[i].name );
char * tempName_1;
while ( !feof( fin ) ) {
tempName_1 = malloc ( sizeof( char ) * 15 );
fscanf( fin, "%s", tempName_1 );
int index = 0;
while ( memcmp( tempName_1, person[index].name, 15 ) != 0 )
index ++;
free( tempName_1 );
fscanf( fin, "%d %d", &person[index].accountMoney, &person[index].numAquaintances );
int b;
char * tempName_2;
for ( b = 0; b < person[index].numAquaintances; b ++) {
tempName_2 = malloc( sizeof( char ) * 15 );
fscanf( fin, "%s", tempName_2 );
i = 0;
while ( memcmp( tempName_2, person[i].name, 15 ) != 0 )
i ++;
free( tempName_2 );
person[i].receivedMoney += ( int ) floor( person[index].accountMoney / person[index].numAquaintances );
person[index].accountMoney = floor( person[index].accountMoney / person[index].numAquaintances ) * person[index].numAquaintances;
}
}
}
int main() {
FILE * fin = fopen ("gift1.in", "r");
FILE * fout = fopen ("gift1.out", "w");
int NP;
fscanf( fin, "%d", &NP);
struct personsData person[NP];
int i;
for ( i = 0; i < NP; i ++ ) {
person[i].accountMoney = 0;
person[i].receivedMoney = 0;
person[i].numAquaintances = 0;
person[i].name = ( char * ) malloc ( sizeof( char ) * 15 );
}
parseInputs( fin, NP, person );
for ( i = 0; i < NP; i ++ ) {
// print to output file (and also to console for development purposes
fprintf( fout, "%s %d\n", person[i].name, person[i].receivedMoney - person[i].accountMoney );
printf( "%s %d\n", person[i].name, person[i].receivedMoney - person[i].accountMoney );
}
for ( i = 0; i < NP; i ++ ) {
free( person[i].name );
}
exit(0);
}
这是输入文件gift1.in:
5
dave
laura
owen
vick
amr
dave
200 3
laura
owen
vick
owen
500 1
dave
amr
150 2
vick
owen
laura
0 2
amr
vick
vick
0 0