调用释放已存储值的 char 指针时,free() 函数失败

The free() function failed when calling out to free a char pointer that had stored a value

我正在学习一些关于 C 编程语言中动态内存分配的知识。当我试图编写一个描述如下的程序时:

Write a function named duplicate that uses dynamic storage allocation to create a copy of a string. For example, the call

p = duplicate(str);

将分配 space 一个与 str 相同长度的字符串,将 str 的内容复制到新字符串中,并 return 一个指向它的指针。如果内存分配失败,则重复 return 个空指针。

这是《C程序设计语言,现代方法(第2版)》一书第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;
}

它失败了,没有任何输出,return 一个异常值。 在我的书中,它没有提到任何关于这个问题的事情,只是给出了一些关于在没有分配任何值的指针上使用的 free() 函数的例子。我很好奇我的代码有什么问题?如果我想使用 free 函数,正确的使用方法是什么?如何释放指向已赋值内存的指针?

指令

str="Hello world";

将常量字符串 "Hello world" 分配给 str。它不会为带有 malloc 的字符串分配存储空间。所以你不能用 str 作为参数调用 free。只有通过 malloc 获得的指针才可以传递给 free

"Hello world"是一个常量字符串,存放在程序的一个特殊位置。您不得释放和修改它。