【发布时间】:2023-03-03 00:50:01
【问题描述】:
首先,我知道有人问过类似的问题。但是,我想对真正原始的 C 数据类型提出一个更一般的简单问题。就是这样。
在main.c 中,我调用了一个函数来填充这些字符串:
int
main (int argc, char *argv[]){
char *host = NULL ;
char *database ;
char *collection_name;
char *filename = "";
char *fields = NULL;
char *query = NULL;
...
get_options(argc, argv, &host, &database, &collection_name, &filename,
&fields, &query, &aggregation);
内get_options:
if (*filename == NULL ) {
*filename = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+4);
strcpy(*filename, *collection_name);
strcat(*filename, ".tde"); # line 69
}
我的程序运行良好,但 Valgrind 告诉我我做错了:
==8608== Memcheck, a memory error detector
==8608== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==8608== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==8608== Command: ./coll2tde -h localhost -d test -c test
==8608==
==8608== Invalid write of size 1
==8608== at 0x403BE2: get_options (coll2tde.c:69)
==8608== by 0x402213: main (coll2tde.c:92)
==8608== Address 0xa2edd18 is 0 bytes after a block of size 8 alloc'd
==8608== at 0x4C28BED: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8608== by 0x4C28D6F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8608== by 0x403BBC: get_options (coll2tde.c:67)
==8608== by 0x402213: main (coll2tde.c:92)
你能解释错误Address 0xa2edd18 is 0 bytes after a block of size 8 alloc'd吗?
我该如何解决这个问题?
【问题讨论】:
-
不管怎样,我发现这条错误消息令人困惑,因为我误解了“之后”的含义。我认为这意味着“在分配块之后”,但当然它实际上意味着“在分配块之后的内存中”。换句话说:
Address 0x... appears immediately (0 bytes) after an alloc'd block of size 8