调用释放已存储值的 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"是一个常量字符串,存放在程序的一个特殊位置。您不得释放和修改它。
我正在学习一些关于 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"是一个常量字符串,存放在程序的一个特殊位置。您不得释放和修改它。