Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 释放内存、功能_C_Linked List_Malloc - Fatal编程技术网

C 释放内存、功能

C 释放内存、功能,c,linked-list,malloc,C,Linked List,Malloc,我正在尝试释放我在一个函数中分配给另一个函数的一些内存。这方面的一个例子是: MusicRec * createRecord(char * title, char * artist, double fileSize, int length, char theType) { MusicRec * newRecord; MusicRec * next; newRecord = malloc(sizeof(MusicRec)); newRecord->title = malloc(sizeof

我正在尝试释放我在一个函数中分配给另一个函数的一些内存。这方面的一个例子是:

MusicRec * createRecord(char * title, char * artist, double fileSize, int length, char theType)
{
MusicRec * newRecord;
MusicRec * next;

newRecord = malloc(sizeof(MusicRec));
newRecord->title = malloc(sizeof(char)*(strlen(title))+1);
strcpy(newRecord->title, title);
newRecord->artist = malloc(sizeof(char)*(strlen(artist))+1);
strcpy(newRecord->artist, artist);
newRecord->sizeInKB = fileSize;
newRecord->lengthInSeconds = length;
newRecord->type = theType;
newRecord->next = NULL;
next = NULL;
return(next);
}

我在那个函数中有malloced内存,但现在我正试图在另一个函数中释放这个malloced内存,比如我的主函数。我该怎么做?

只需使用相应的释放函数
free()
记住,您根本无法使用已释放的内存

需要考虑的几点:

  • 最好更改分配内存的方式,以便更轻松地更改类型:
    • Was:
      newRecord=malloc(sizeof(MusicRec))
    • 应该是:
      newRecord=malloc(sizeof*newRecord)
  • 考虑为您经常做的事情定义一些辅助函数。示例(此函数通常已经定义):
    • Was:
      newRecord->title=malloc(sizeof(char)*(strlen(title))+1);strcpy(新记录->标题,标题)
    • 应该是:
      newRecord->title=strdup(title)
  • 永远不要使用
    sizeof(char)
    :它看起来不识字,因为你实际上是在问:我需要多少个char才能保存一个char
对于未定义的情况:

char* strdup(const char* str) {
    size_t len = strlen(str) + 1;
    char* ret = malloc(len);
    memcpy(ret, str, len);
    return ret;
}

如果已将该变量作为引用从另一个函数传递,则可以使用free()函数从该函数中释放该变量;否则,如果按值传递,则无法从另一个函数中释放该变量。

在一个函数中分配内存,在另一个函数中释放内存是有问题的。你不能在主函数中分配它,将分配的内存传递给另一个函数,然后在返回主函数后再次释放它吗?该函数的奇怪之处在于你声明了两个指针,但实际上你只使用了
newRecord
指针。但是,将未使用的指针设置为
NULL
后,返回该指针。结果是函数总是返回
NULL
,对新分配的内存不做任何处理。该函数可能会返回
newRecord
@Dour:你真的是这个意思吗?你将如何构建任何抽象?在一个地方
malloc
,在另一个地方
free
都很好。如果我正在释放结构的一个元素,它还能工作吗?你确定吗?可以通过值将指针传递给另一个函数,然后在另一个函数中释放指针。至关重要的是,不要在原始函数中再次使用指针。类似地,您可以将分配的指针返回给调用函数,调用函数可以安排释放指针。所以,我认为你的陈述不准确。我已经在我的代码中使用了这种类型的东西,如果你传递了指针的引用,它将从另一个函数中释放内存。你是说这段代码不起作用:
void分配器(size\u t size){void*vp=malloc(size);releaser(vp);}
void releaser(void*vp){free(vp);}
?指针是通过值从
allocator()
传递到
releaser()
,但是
releaser()
可以释放它。或者你是在想
void int-alloc(size\t n){int*data=malloc(n*sizeof(*data));int-free(data[0])}
其中
int-free()
无法写入以释放作为参数传递的整数?