- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有以下代码:
char *filedata;
FILE *f;
filedata = malloc(3);
if (filedata == NULL)
{
fprintf(stderr, "out of memory\n");
exit(1);
}
memcpy(filedata, "foo", 3);
f = fmemopen(filedata, 3, "r");
if (f == NULL)
{
fprintf(stderr, "out of memory\n");
exit(1);
}
fclose(f);
free(filedata);
现在,当我使用 Valgrind 执行此操作时,出现以下错误:
==32454== Invalid read of size 1
==32454== at 0x4006D33: __GI_strlen (mc_replace_strmem.c:284)
==32454== by 0x855B7E: fmemopen (fmemopen.c:246)
==32454== by 0x80485BF: main (in /home/tilli/memopen/a.out)
==32454== Address 0x402502b is 0 bytes after a block of size 3 alloc'd
==32454== at 0x4005BDC: malloc (vg_replace_malloc.c:195)
==32454== by 0x8048548: main (in /home/tilli/memopen/a.out)
似乎 fmemopen
正在为我传递给它的参数执行 strlen()
。但是,手册页说 fmemopen
的缓冲区参数可以是字符串或内存缓冲区(因此它不必以 '\0'
结尾) .此外,它表示参数必须至少为 size
字节长,事实确实如此。
这里有什么问题?我刚刚在库函数 fmemopen
中发现了一个错误吗?如果 strlen
没有找到 '\0'
终止符,我是否纠正了在极端情况下这个错误可能会使使用 fmemopen
的程序崩溃但是而是继续读取未映射的内存?
我正在运行 Fedora 12 版。
最佳答案
从手册看来,\0
被用作流缓冲区的 EOF 标记,除非模式包含 b
。这解释了为什么使用 strlen() 来定位 EOF。
来自 man fmemopen:
The argument mode is the same as for fopen(3). If mode specifies an append mode, then the initial file position is set to the location of the first null byte ('\0') in the buffer; otherwise the initial file position is set to the start of the buffer. Since glibc 2.9, the letter 'b' may be specified as the second character in mode. This provides "binary" mode: writes don't implicitly add a terminating null byte, and fseek(3) SEEK_END is rela‐ tive to the end of the buffer (i.e., the value specified by the size argument), rather than the current string length.
然而,在同一个人身上我们可以读到:
In a stream opened for reading, null bytes ('\0') in the buffer do not cause read operations to return an end- of-file indication. A read from the buffer will only indicate end-of-file when the file pointer advances size bytes past the start of the buffer.
所以你可能发现了一个错误。
关于c - fmemopen 给出 Valgrind 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29229663/
我正在尝试使用 fmemopen 函数将可执行文件的 char* 映射到内存中,该函数应该返回一个 FILE * 以便能够使用它(根本无需将其写入硬盘)。 fmemopen 函数更改文件的问题,因此当
我在“w+”模式下使用 fmemopen() 打开了一个内存流。我在这个文件中写了一些数据,然后我试图读取数据来计数。写的行。但是我通过使用 fgets() 访问这个文件得到了垃圾值。我的代码很大,所
我正在尝试从使用 fmemopen 和 char * 创建的流中读取宽字符。 char *s = "foo bar foo"; FILE *f = fmemopen(s,strlen(s),"r");
我正在使用 fmemopen 创建一个变量 FILE* fid 以将其传递给一个从打开的文件中读取数据的函数。 在该函数的某处,它使用以下代码找出文件的大小: fseek(fid, 0, SEEK_E
我无法让 fmemopen 一致地打印到 cstring。做这样的事情: #include #include int main(void) { char buf[256]; FIL
我有以下代码: char *filedata; FILE *f; filedata = malloc(3); if (filedata == NULL) { fprintf(stderr, "
我在 Linux 中有一个 fmemopen 文件描述符(指向父缓冲区),我希望能够在 C 中将此文件描述符设置为子进程的标准输入(我不为子进程设置)可以访问代码) 这可能吗?如果是这样,我该怎么做?
在阅读 string streams 上的 GNU 文档时我发现了两个相似的函数,它们做的事情非常相似: FILE * fmemopen (void *buf, size_t size, const
我正在尝试插入最初从 stdin 读取的 fscanf 函数,例如 fscanf(stdin,"%ms", &secret)。在我的插入函数中,我试图让它从我用字符串创建的输入文件中读取。以下是我正在
可以肯定的是,缓冲 I/O 到磁盘上的文件比无缓冲更快。但为什么即使写入内存缓冲区也有好处? 以下基准代码示例是使用 gcc 5.40 使用优化选项 -O3 编译的,链接到 glibc 2.24。 (
已通过 glibc 2.24 解决 -- 请参阅下面的更新 这是一段 C 代码(使用 gcc 5.3.1、glibc 2.23 编译): #include #include #include #
我可以使用什么来编写自定义流? 最佳答案 fmemopen 是 POSIX 但不是 C 标准的一部分。 fopencookie 不是任何标准的一部分;这是一个 GNU 函数。 tmpfile 是 fm
我是一名优秀的程序员,十分优秀!