C - memset与免费

时间:2014-08-03 18:18:34

标签: c free memset

我很困惑在调用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有点新意,所以请用非专业人士的话来说谢谢

6 个答案:

答案 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()方法只是释放内存空间并使其可以被占用。