次のコードでiOSデバイスでmmapを使用しようとしています
struct stat s;
int status;
size_t size;
int fd;
fd = open ([dataFile cStringUsingEncoding:NSUTF8StringEncoding], O_RDONLY);
fcntl( fd, F_NOCACHE );
status = fstat (fd, & s);
if (status < 0)
{
// error handling
}
size = s.st_size;
FuncFileLog(@"%@", @"before read");
off_t offset = 0;
char* data = (char *) mmap(NULL, size, PROT_READ, MAP_SHARED, fd, offset);
char *pch;
int lastPosInString = 0;
pch=strchr(data,'\n');
long lineCounter = 0;
while (pch != NULL)
{
size_t lineLength = 0;
int posInString = pch - data + 1;
lineLength = posInString - lastPosInString;
char *out = calloc(lineLength, sizeof(char));
memcpy(out, data + lastPosInString, lineLength);
out[lineLength - 1] = '\0';
if (lineCounter > 0)
{
// do something
}
lastPosInString = posInString;
pch=strchr(pch+1,'\n');
lineCounter = lineCounter + 1;
}
munmap((void *)data, size);
close(fd);
それは動作しますが、3.5 mbのファイルを読み取ると、理由もなくEXC_BAD_ACCESSが0xffffffff
表示されることがあります。これは、mmapからのデータポインタがエラーだと思うためです。そしてそれはシミュレーターでのみ起こるようです。
私は
errno:12 Cannot allocate memory
現在、ガードマロック、ガードエッジ、落書き、ゾンビがオンになっているシミュレーターでのみ取得します