【发布时间】:2020-04-18 00:08:59
【问题描述】:
我正在学习有关 C 编程语言中动态内存分配的知识。当我试图编写如下描述的程序时:
编写一个名为 duplicate 的函数,该函数使用动态存储分配来创建字符串的副本。比如调用
p = 重复(str);
会为一个与 str 长度相同的字符串分配空间,将 str 的内容复制到新字符串中,并返回一个指向它的指针。如果内存分配失败,则重复返回一个空指针。
这是《C Programming Language, A Modern Approaches(2nd ver.)》一书第17章的练习2。
在我的第一次尝试中,我编写了如下代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *duplicate(char* str){
char* news=(char*)malloc((strlen(str)+1)*sizeof(char));
if(news==NULL){
printf("Error: malloc failed\n");
return NULL;
}
strcpy(news,str);
return news;
}
int main(){
char *str,*p;
str="Hello world";
p=duplicate(str);
puts(p);
return 0;
}
成功运行。 但是当我修改我的代码调用 free(str) 如下:
int main(){
char *str,*p;
str="Hello world";
p=duplicate(str);
free(str);
puts(p);
return 0;
}
它没有任何输出就失败并返回一个正常值。 在我的书中,它没有提到任何关于这个问题的内容,只是给出了一些关于 free() 函数的例子,该函数在没有分配任何值的指针上使用。我很好奇我的代码有什么问题?如果我想使用 free 函数,使用它的正确方法是什么?如何释放指向已分配某个值的内存的指针?
【问题讨论】:
-
您不能通过
free()获取不是从malloc()(或calloc()或realloc())获得的东西。在你想要的程序中:p = duplicate(str); puts(p); free(p); -
你可以
free(p)。你不能(也不需要)免费str。 -
OT:在C语言中不需要转换
void-pointers,例如返回我的malloc()。 -
如果
duplicate()失败,代码不应该调用puts(),如果它返回NULL会说。 -
执行
if (news == NULL) { printf("Error: malloc failed\n"); } else { strcpy(news, str); } return news;会更简单,更不容易出错。它也遵循了很好的模式,每个函数只有 一个 退出点。
标签: c string dynamic-memory-allocation free assign