我很困惑在调用memset时内存中实际发生的事情与调用free时发生的情况相比。
例如,我有一个指针A指向char *'
的数组char** A = (char**)calloc(5, sizeof(char*));
int i;
for(i=0;i<5;i++)
{
//filling
A[i] = (char*)calloc(30, sizeof(char));
scanf("%s", &A[i]);
}
现在我想重置它的char **指针和所有元素 它指向完全是空的
memset(A, 0, 5);
或
free(A);
有什么区别?
我对C有点新意,所以请用非专业人士的话来说谢谢
答案 0 :(得分:8)
不同之处在于memset
实际上设置了内存块的值,而free
则返回内存以供操作系统使用。
通过使用物理事物的类比,应用于六包啤酒的memset(beer, 0, 6)
会将“0”的值应用于数组beer
的所有六个成员,而free(beer)
则会相当于将六包装送给朋友。
答案 1 :(得分:7)
memset
函数将内存区域设置为请求的值。请注意,您提供的大小是 bytes 的数量。
free
函数释放已分配的内存,因此无法再使用它。调用free
通常不会以任何方式修改内存。调用free
后使用内存会导致未定义的行为。
答案 2 :(得分:3)
这两种方法都不正确,但有些互补。
memset
会将缓冲区的内容设置为给定值,在您的情况下为0。这将改变指针的值,这将导致您丢失对分配的缓冲区的引用(在每个A[i]
中)。
free(A)
将释放A指向的缓冲区,但此缓冲区包含指针,并且不会释放它们指向的每个缓冲区。
简而言之 - memset不释放动态分配的缓冲区,而free则不会将其设置为零。
正确的做法是这样的:
for(i=0;i<5;i++)
{
// complementary to
// A[i] = (char*)calloc(30, sizeof(char));
free(A[i]);
}
// complementary to
// char** A = (char**)calloc(5, sizeof(char*));
free(A);
A = NULL; // so no one gets confused...
答案 3 :(得分:1)
free
释放内存,这意味着A仍然指向同一个内存位置,现在无效。
memset
会将A当前指向的内存设置为您想要的内容。
答案 4 :(得分:0)
memset
更改内存地址的内容。它不会改变内存是否已分配/取消分配。
free
不会更改内存地址的内容。它释放内存块,使程序可以回收和重用。因此,任何指向此块的指针都会变为无效,并且尝试访问内存应该会导致Segfault(&#34;如果你很幸运,那么#34;正如我的教授所说的那样)。
当您知道要再次访问该地址的数据时,请使用memset
。当您知道将不再再次访问数据并且程序可能回收该内存时,请使用free
。
答案 5 :(得分:0)
memset()方法只是将给定字符的x内存字节替换为指针* a指向的已分配内存;
memset(a, 'a', x);
memset()方法的原型是:
void* memset(void*, unsigned int, int);
memset()
的行为与strcpy()
相似,但区别在于memcpy()
按原样(字节)复制了数据,但strcpy
也复制了格式化的字符串(因此需要比memcpy
执行的时间更长。
但是,free()
方法只是释放内存空间并使其可以被占用。