如何编写一个函数来清空C字符串并/或释放已分配的内存?为什么下面的代码不起作用?
void freeStr(char** str) {
free(*str);
}
int main() {
char* str = "some string";
freeStr(&str);
printf("%s", str);
return 0;
}
你既不能释放也不能清除字符串字面量所代表的数组的内存。
然而,要失去对其的访问权限,您只需要更改存储其地址的指针:
str = NULL; // in main
// or
*str = NULL; // in freeStr
"some string\0"
CONST_DATA部分在汇编中类似于数据段(DS),其中包含全局和静态(只读)变量,它们在编译时初始化。它们在运行时不会改变,并继续为运行中的程序分配。free()
动态分配的内存,则可以执行以下操作:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LENGTH 20
void freeStr(char **str)
{
free( *str );
*str = NULL;
}
int main() {
char *str = malloc( sizeof(char) * LENGTH);
// clear that allocated memory
memset( str, 0x00, LENGTH );
// Put some text into the memory
strncpy( str, "Some text", LENGTH-1 );
printf("Before: %s\n", str);
freeStr(&str);
// string is now NULL and the memory is free.
printf("After: %s\n", str);
return 0;
}
*str = NULL;
?为什么仅使用 free(*str);
不能清除内存(因为我们正在释放内存)?为什么我们能够获取已经被释放或删除的字符串内存内容?你能详细解释一下吗? - ussmalloc()
、calloc()
或realloc()
等)来free()
一个C字符串。malloc()
或其他堆分配函数来分配字符串,并将一个字符串复制到其中,您可以通过调用memset()
来清除它,但您仍然需要调用free()
将该内存释放回堆中。char* strPtr = malloc(32); // allocate 32 bytes of storage off the heap
strcpy(strPtr, "test"); // copy a string into the newly allocated block on the heap
memset(strPtr, 0, 32); // clear the allocated block
free(strPtr); // return the allocated block to the heap
void foo() {
char strArray[32]; // this is a stack allocation
strcpy(strArray, "test"); // copy a string onto the stack
return; // no call to free() required
}
char* str = "literal string";
字符串“literal string”的空间位于静态分配的段中,不应该被写入。在某些平台上,如果尝试写入该内存段,则会导致段错误。不应尝试清除静态分配的内存块,因为无法保证它们映射到的段是可写的。
http://en.cppreference.com/w/c/memory/free
void free( void* ptr );
释放之前由malloc()、calloc()或realloc()分配的空间。如果ptr是空指针,则函数不执行任何操作。
您的字符串没有使用这些函数中的任何一个进行分配。我认为是这样的。
void freeStr(char **str) {
*str = NULL;
}
int main() {
char* str = (char *)"some string";
printf("Before: %s\n", str);
freeStr(&str);
printf("After: %s\n", str);
return 0;
}
new
,就不能使用delete
;如果你没有使用malloc
、calloc
或realloc
,就不能使用free
。 - SSpoke
const char []
,因此您无法安全地修改字符串文字的数据,也不应该free
它,因为您没有malloc
它...它甚至不在堆上。 - obataku