- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
t_syntaxTree
是一个结构,定义为:
typedef struct t_syntaxTree {
char nodeName[16];
int nodesLen;
struct t_syntaxTree** nodes;
} t_syntaxTree;
我写了函数 treeToStr
来转换字符串中的语法树,代码应该是自解释的。输出字符串格式类似于 lisp,例如输出字符串可以是 (or (and true true) (> b 3))
。以下代码有效,但如果我使用 valgrind 执行程序,它会因段错误而崩溃。此外,在崩溃之前,valgrind 告诉我我的某些 realloc 调用无效。
int recTreeToStr(t_syntaxTree* t, char* str, int len) {
if (t->nodesLen == 0) {
int nLen = len + strlen(t->nodeName);
str = realloc(str, sizeof(char) * nLen);
strcat(str, t->nodeName);
return nLen;
}
else {
int nLen = len + strlen(t->nodeName) + 1;
str = realloc(str, sizeof(char) * nLen);
strcat(str, "(");
strcat(str, t->nodeName);
for (int i=0; i<t->nodesLen; i++) {
nLen++;
str = realloc(str, sizeof(char) * nLen);
strcat(str, " ");
nLen = recTreeToStr(t->nodes[i], str, nLen);
}
nLen++;
str = realloc(str, sizeof(char) * nLen);
strcat(str, ")");
return nLen;
}
}
char* treeToStr(t_syntaxTree* tree) {
char* str=malloc(sizeof(char));
str[0] = '\0';
recTreeToStr(tree, str, 1);
return str;
}
这是崩溃前的 valgrind 报告(在此消息之后程序立即因段错误而崩溃):
==26561== Invalid free() / delete / delete[] / realloc()
==26561== at 0x4839D7B: realloc (vg_replace_malloc.c:826)
==26561== by 0x10B3C4: recTreeToStr (cooper.c:443)
==26561== by 0x10B420: recTreeToStr (cooper.c:445)
==26561== by 0x10B420: recTreeToStr (cooper.c:445)
==26561== by 0x10B420: recTreeToStr (cooper.c:445)
==26561== by 0x10B4C0: treeToStr (cooper.c:459)
==26561== by 0x10B4F2: cooper (cooper.c:467)
==26561== by 0x10922E: main (test.c:6)
==26561== Address 0x4a6aee0 is 0 bytes inside a block of size 15 free'd
==26561== at 0x4839D7B: realloc (vg_replace_malloc.c:826)
==26561== by 0x10B310: recTreeToStr (cooper.c:431)
==26561== by 0x10B420: recTreeToStr (cooper.c:445)
==26561== by 0x10B420: recTreeToStr (cooper.c:445)
==26561== by 0x10B420: recTreeToStr (cooper.c:445)
==26561== by 0x10B420: recTreeToStr (cooper.c:445)
==26561== by 0x10B4C0: treeToStr (cooper.c:459)
==26561== by 0x10B4F2: cooper (cooper.c:467)
==26561== by 0x10922E: main (test.c:6)
==26561== Block was alloc'd at
==26561== at 0x4839D7B: realloc (vg_replace_malloc.c:826)
==26561== by 0x10B3C4: recTreeToStr (cooper.c:443)
==26561== by 0x10B420: recTreeToStr (cooper.c:445)
==26561== by 0x10B420: recTreeToStr (cooper.c:445)
==26561== by 0x10B420: recTreeToStr (cooper.c:445)
==26561== by 0x10B4C0: treeToStr (cooper.c:459)
==26561== by 0x10B4F2: cooper (cooper.c:467)
==26561== by 0x10922E: main (test.c:6)
==26561==
==26561== Invalid read of size 1
==26561== at 0x10B3DF: recTreeToStr (cooper.c:444)
==26561== by 0x10B420: recTreeToStr (cooper.c:445)
==26561== by 0x10B420: recTreeToStr (cooper.c:445)
==26561== by 0x10B420: recTreeToStr (cooper.c:445)
==26561== by 0x10B4C0: treeToStr (cooper.c:459)
==26561== by 0x10B4F2: cooper (cooper.c:467)
==26561== by 0x10922E: main (test.c:6)
==26561== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==26561==
==26561==
==26561== Process terminating with default action of signal 11 (SIGSEGV): dumping core
==26561== Access not within mapped region at address 0x0
==26561== at 0x10B3DF: recTreeToStr (cooper.c:444)
==26561== by 0x10B420: recTreeToStr (cooper.c:445)
==26561== by 0x10B420: recTreeToStr (cooper.c:445)
==26561== by 0x10B420: recTreeToStr (cooper.c:445)
==26561== by 0x10B4C0: treeToStr (cooper.c:459)
==26561== by 0x10B4F2: cooper (cooper.c:467)
==26561== by 0x10922E: main (test.c:6)
==26561== If you believe this happened as a result of a stack
==26561== overflow in your program's main thread (unlikely but
==26561== possible), you can try to increase the size of the
==26561== main thread stack using the --main-stacksize= flag.
==26561== The main thread stack size used in this run was 8388608.
==26561==
==26561== HEAP SUMMARY:
==26561== in use at exit: 1,249 bytes in 46 blocks
==26561== total heap usage: 224 allocs, 178 frees, 21,257 bytes allocated
==26561==
==26561== 17 bytes in 1 blocks are definitely lost in loss record 2 of 11
==26561== at 0x4839D7B: realloc (vg_replace_malloc.c:826)
==26561== by 0x10B310: recTreeToStr (cooper.c:431)
==26561== by 0x10B420: recTreeToStr (cooper.c:445)
==26561== by 0x10B420: recTreeToStr (cooper.c:445)
==26561== by 0x10B420: recTreeToStr (cooper.c:445)
==26561== by 0x10B420: recTreeToStr (cooper.c:445)
==26561== by 0x10B4C0: treeToStr (cooper.c:459)
==26561== by 0x10B4F2: cooper (cooper.c:467)
==26561== by 0x10922E: main (test.c:6)
==26561==
==26561== LEAK SUMMARY:
==26561== definitely lost: 17 bytes in 1 blocks
==26561== indirectly lost: 0 bytes in 0 blocks
==26561== possibly lost: 0 bytes in 0 blocks
==26561== still reachable: 1,232 bytes in 45 blocks
==26561== suppressed: 0 bytes in 0 blocks
==26561== Reachable blocks (those to which a pointer was found) are not shown.
==26561== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==26561==
==26561== For counts of detected and suppressed errors, rerun with: -v
==26561== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)
最佳答案
在您第一次调用 realloc
之后,您已经释放了 str
。它已被新分配取代。然后你的函数返回而不在任何地方存储 str
的新值。
是的,您在 recTreeToStr
返回后使用了无效的 str
值。
关于c - Valgrind 崩溃并给我这个无效的 realloc 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53527042/
如果 realloc 失败并返回 NULL 是前一个缓冲区被释放还是保持不变?我没有在手册页中找到那条特定的信息,我不确定该怎么做。如果内存被释放,那么双重释放可能会有风险。如果没有,就会发生泄漏。
OS: Linux CC: GCC 4.8.2 目标:改变 char* 的大小 -> 变小 问题:更改后的大小相同... 行是带有数据的字符串... 代码片段: char * tmp = NUL
在一个函数中我使用了 malloc : void name1(struct stos* s) { s = malloc (4 * sizeof (int)); } 一切正常。但是后来我用了rea
我知道有一个 realloc允许我调整内存块大小的函数(它与一个免费函数配对)。但是,我正在尝试对一些成员指针使用 new 而不是 realloc 分配内存的 c++ 类执行相同的操作。在 C++ 中
我正在尝试在 C 中创建一个动态整数数组,它应该在填满后自动将其大小加倍。 要扩展数组的大小,我想使用 realloc 函数。不幸的是,指向我的 DynamicArray 和 GCC 崩溃的数据的指针
这是我被教导使用的方式 realloc() : int *a = malloc(10); a = realloc(a, 100); // Why do we do "a = .... ?" if(a
我尝试在每个循环中使用 realloc(),因此我只为 C 中的 int 数组使用必要的内存,但输出值已更改。尽管如此,在我的代码中使用 Valgrind 时,我得到了正确的值。 我在做 Advent
平台:Linux 3.2.0 x86 (Debian Wheezy) 编译器:GCC 4.7.2 (Debian 4.7.2-5) 我想知道如果我尝试 realloc() 一个已递增的指针会发生什么。
我知道可以在内核中使用 malloc 在 GPU 的全局内存上分配内存。是否也可以使用realloc? 最佳答案 您可以为您的数据类型编写自己的 realloc 设备函数。 只需为新数组分配新空间,将
我在对数组使用 malloc/realloc 命令时遇到了一些问题。我创建了一个包含一些整数的小数组,并尝试通过使用 realloc 扩展大小并添加值来为其添加一个值,但是当我这样做时,0 索引的值不
背景: 我使用 calloc() 创建了一个数组,一切都运行良好。然后我使用 realloc() 使数组更大。它似乎只是创建一个没有任何内容的新指针,并在我尝试访问数组中的元素时调用运行时错误。 我的
假设我已经使用 malloc() 分配了内存,如果我在我的代码中这样做: char *newline = realloc ( oldline , newsize ); // Assuming oldl
我正在尝试在下面的程序中使用 realloc 重新分配内存,并在我使用 malloc(i = (int*)malloc(5 * sizeof(int))) 使用react的 realloc 初始内存之
为什么下面的代码输出两次 4,而不是 8 和 20?谢谢 int size = 0; int *pointer; pointer = malloc(2 * sizeof(int)); size = s
我正在尝试将一堆 WCHAR 添加到缓冲区。这个函数就是将它添加到我的缓冲区中的原因.. DWORD add_to_buffer(BYTE *databuffer, WCHAR *path, WCHA
可能我的大脑现在不能正常工作......我想知道为什么我在我的代码中收到提到的错误: int ** zm; zm = (int**)calloc(1, sizeof(int*)); *zm = (in
我正在尝试用 C 语言编写代码,但遇到了 realloc 的问题。该代码在某个时间点工作正常,但在另一时间重新分配期间因堆损坏错误而崩溃。我已将填充数据的结构和函数粘贴到其中。谁能告诉我我是否在这里做
realloc 会改变它的第一个参数吗? 改变第一个参数是否取决于实现? 有什么理由不应该是const吗?作为反例,memcpy 将其 src 参数设为 const。 ISO C 标准,第 7.20.
我在 realloc 中遇到此错误,该错误仅发生在我学校的实验室计算机上,而不发生在我的计算机上。 在此程序中,我将行号存储在 File_Node 结构中。 File_Node 是一个链表的一部分,每
来自 man realloc:realloc() 函数返回一个指向新分配的内存的指针,该指针适合任何类型的变量,可能与 ptr 不同,如果请求失败,则返回 NULL . 因此在此代码片段中: ptr
我是一名优秀的程序员,十分优秀!