gpt4 book ai didi

ios - 读取文件后 Objective-C 因 EXC_BAD_ACCESS 崩溃

转载 作者:行者123 更新时间:2023-11-29 00:17:31 24 4
gpt4 key购买 nike

EXC_BAD_ACCESS 导致我的应用崩溃。当您尝试访问未初始化或已释放的内存但我找不到位置时,通常会出现此问题。我尝试在 Xcode 中检查 Zombie,但没有成功。应用程序崩溃并且仪器没有注意到僵尸。 我正在使用 ARC。

错误的访问发生在方法末尾的右花括号上。 (见截图)。该问题仅发生在 Release模式(经过优化)下,并且仅适用于少数设备。

enter image description here

为了测试,我创建了一个虚拟项目,其中在 didFinishLaunching 之后立即调用该方法。

调用堆栈

  1. didFinishLaunchingWithOptions
  2. 分配并初始化我的自定义对象
  3. 对新创建的对象调用 readFile
  4. 执行readFile中的代码
  5. 即将退出 readFile,但应用崩溃

这是代码的简化版本

- (void)readFromFile:(NSString *)fileName {
if (!fileName) {
return;
}

NSString* filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:nil];
if (!filePath) {
return;
}

FILE* file = fopen([filePath UTF8String], "r");
if (file == NULL) {
return;
}

size_t length;
char *cLine = fgetln(file, &length);

// I don't think it matters, but the file has about 400 000 lines
while (length > 0) {
char str[length - 1]; // All lines length are > 2
strncpy(str, cLine, length);
str[length - 1] = '\0'; // The crash would still occurs without this line, but less often

// Custom code with str

cLine = fgetln(file, &length);
}
fclose(file);
}

如果它可以帮助您,这是我的阅读器对象的代码

@protocol MyReaderProtocol <NSObject>
- (void)readFromFile:(NSString *)fileName;
@end

@interface MyReader : NSObject <MyReaderProtocol>
@end

// How I initialize the objet in the app delegate
MyReader myReader = [[MyReader alloc] init];
[myReader readFromFile:@"myFile.txt"];

最佳答案

仅基于阅读您的代码

fgetln()的函数调用在length中返回该行中的字符数。

具有 n 个元素的 C 字符数组声明为 char a[n],元素寻址为 a[0]a[n-1]

您需要为 EOS 存储 length 个字符加 1,您分配了一个容量为 length - 1 的数组,这 2 太短了。

然后,您的 strncpy() 会写入数组末尾。

最后,当最大索引为 length - 2 时,您在索引 length - 1 处写入 EOS。

您只覆盖了 1 个字节(您在该行的最后一个字符上写入 EOS),但这足以破坏堆栈上数组旁边的任何内容(可能是 cLine...)

HTH

关于ios - 读取文件后 Objective-C 因 EXC_BAD_ACCESS 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44939363/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com