gpt4 book ai didi

c - 递增指针后释放内存

转载 作者:太空宇宙 更新时间:2023-11-04 05:10:17 24 4
gpt4 key购买 nike

gcc (GCC) 4.7.2
c89

你好,

All error checking removed from snippet - to keep the code short.

我在释放一些已分配并复制字符串的内存时遇到问题。

我的程序将检查数字并递增指针直到它到达非数字。

当我去释放内存时,我得到一个包含无效释放的堆栈转储。

我认为这是因为我增加了指针,现在它指向字符串的中间位置,因为那是非数字开始的时候。如果我不增加它可以免费。但是,如果我确实递增它然后尝试释放它,我会得到堆栈转储。

int parse_input(const char *input)
{
char *cpy_input = calloc(strlen(input) + 1, sizeof(char));
size_t i = 0;

apr_cpystrn(cpy_input, input, strlen(input) + 1);



/* Are we looking for a range of channels */
for(i = 0; i < strlen(cpy_input); i++) {
if(isdigit(*cpy_input)) {
/* Do something here */
cpy_input++;
}
}

/* Where finished free the memory */
free(cpy_input); /* Crash here */

return 0;
}

我通过声明另一个指针并分配地址解决了这个问题,所以它指向第一个字符,然后我释放它。它工作正常,即

  char *mem_input = cpy_input;
free(mem_input);

我的问题是为什么我需要声明另一个指针才能释放内存?还有其他方法吗?

非常感谢,

最佳答案

您需要保存原始指针。释放内存时只能使用原始指针。您可以创建另一个变量来保存原始指针。

或者将循环放在一个单独的函数中。由于默认情况下变量是按值传递的,即复制,当您在函数中更改指针时,您只会更改指针的副本。

除此之外,您的循环看起来有点奇怪。您循环使用从零到字符串长度的索引,因此您可以轻松地使用该索引而不是修改指针。要么,要么将循环更改为类似 while (*cpy_input != '\0') 的内容。我从未见过混合使用这两种变体。

顺便说一句,你的代码中有一个错误。如果当前字符是数字,您只能增加指针。但是如果第一个字符不是一个数字,循环将一直循环直到它到达字符串的末尾,但是指针将不会增加并且你将检查第一个字符一遍又一遍。如果您只想从字符串中获取前导数字(如果有的话),您可以使用一个循环,例如

for (; isdigit(*cpy_input); cpy_input++)
{
/* do something, using `*cpy_input` */
}

或者当然

for (int i = 0; i < strlen(cpy_input); i++)
{
/* do something, using `cpy_input[i]` */
}

关于c - 递增指针后释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17440621/

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