【发布时间】:2013-06-30 16:59:35
【问题描述】:
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);
我的问题是为什么我需要声明另一个指针才能释放内存?还有其他方法吗?
非常感谢,
【问题讨论】:
-
你可以使用另一个变量来处理分配的内存,其中将
cpy_input声明为char * const cpy_input,重要的是你是free(same_address);,你是从malloc()的调用中得到的 -
您只能向
free()提供以前由malloc()、calloc()或realloc()返回的指针。将指针返回到分配的空间是不够的;它必须与返回的值完全相同。