c - 为什么这个动态字符串创建会在固定数字后抛出 exc_bad_access 错误?

标签 c string pointers exc-bad-access realloc

好的,所以我正在尝试将文件中的文本存储在字符串中,并且一切正常,直到我注意到我没有正确地重新分配内存,它不应该工作。

这是我在更正之前的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),因此理论上它不应该工作。

现在,当我更正重新分配时,它会在 writingAt=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) 个字符,它是比实际分配的字符数多一个。

关于c - 为什么这个动态字符串创建会在固定数字后抛出 exc_bad_access 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41007010/

相关文章:

c - 需要一个指针声明来保存整数数组的地址

c++ - 在 C++ 中删除指针

似乎无法在 function 和 main 之间传递信息

c++ - rand() 有时会连续返回相同的结果吗?

string - 从 io::stdin().read_line() 中修剪 '\n' 的更好方法是什么?

.net - 如何在 .NET 中将字符串转换为字节数组?

c - 在C中将字符串拆分为数组时遇到问题

c - uint32 数组到 float32 数组,就地

java - 嵌套循环的第一个 while 循环只迭代一次

c - 使用 qsort() 对指向包含字符串的结构的指针进行排序