好的,所以我试图将文件中的文本存储在字符串中,并且一切正常,直到我注意到我没有正确地重新分配内存,并且它不应该工作。
这是我main
在更正它之前的功能:
FILE * file;
char * quijote, thisChar;
unsigned int writingAt = 0;
file = fopen("quijote.txt", "r");
quijote = malloc(1);
if (file != NULL) {
while (1) {
thisChar = (char)fgetc(file);
if (thisChar == EOF) {
break;
} else {
printf("strlen(quijote) = %lu; writingAt = %i\n", strlen(quijote), writingAt);
quijote = (char *) realloc(quijote, (sizeof(quijote) + 1));
quijote[writingAt] = thisChar;
quijote[writingAt + 1] = '\0';
writingAt++;
}
}
} else {
perror("fopen");
}
fclose(file);
它可以完美运行,并且可以将所有文件正确存储在字符串中。请注意,内存重新分配是不正确的,因为它sizeof(quijote)
总是具有相同的值(8),因此从理论上讲它应该不起作用。
现在,当我纠正了重新分配后,当writeAt = 135167时,它会随机引发EXC_BAD_ACCESS错误。这是“更正”的main
功能:
FILE * file;
char * quijote, thisChar;
unsigned int writingAt = 0;
file = fopen("quijote.txt", "r");
quijote = malloc(1);
if (file != NULL) {
while (1) {
thisChar = (char)fgetc(file);
if (thisChar == EOF) {
break;
} else {
printf("strlen(quijote) = %lu; writingAt = %i\n", strlen(quijote), writingAt);
quijote = (char *) realloc(quijote, (writingAt + 1));
quijote[writingAt] = thisChar;
quijote[writingAt + 1] = '\0';
writingAt++;
}
}
} else {
perror("fopen");
}
fclose(file);
这些是程序在错误之前打印的最后几行:
strlen(quijote) = 135162; writingAt = 135162
strlen(quijote) = 135163; writingAt = 135163
strlen(quijote) = 135164; writingAt = 135164
strlen(quijote) = 135165; writingAt = 135165
strlen(quijote) = 135166; writingAt = 135166
strlen(quijote) = 135167; writingAt = 135167
Exception: EXC_BAD_ACCESS (code=1, address=0x10fc20000)
我不明白为什么以前的代码起作用而这没有起作用,或者为什么程序在该特定数字中引发错误。另外,我尝试像这样重新分配给大小1:quijote = (char *) realloc(quijote, 1);
由于某种原因,它也可以工作...
您分配writingAt + 1
字符,然后访问quijote[writingAt + 1]
这是未定义的行为-它是第(writingAt + 2)个字符,比分配的实际字符数多一个。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句