C编程:使用堆进行字符串复制

C编程:使用堆进行字符串复制,c,memory-management,C,Memory Management,即使newString是本地的,并且应该在函数末尾释放,上述代码也可以工作。我是C新手,任何解释这个或解释的链接都会很有帮助。我的意思是,我们不应该得到这样一个错误:与本地内存相关联的堆栈内存地址吗 返回变量“newString”?newString的值是堆上字符串的地址 上面的代码返回newString的值 在释放堆上的字符串或进程退出之前,堆上的字符串不会被销毁。newString是StringCopy函数作用域中的局部变量。它被分配一个指向malloc'ed内存的指针 当我们从这个函数返回

即使newString是本地的,并且应该在函数末尾释放,上述代码也可以工作。我是C新手,任何解释这个或解释的链接都会很有帮助。我的意思是,我们不应该得到这样一个错误:与本地内存相关联的堆栈内存地址吗 返回变量“newString”?

newString的值是堆上字符串的地址

上面的代码返回newString的值


在释放堆上的字符串或进程退出之前,堆上的字符串不会被销毁。

newString是StringCopy函数作用域中的局部变量。它被分配一个指向malloc'ed内存的指针

当我们从这个函数返回时,变量newString将被释放。但是,分配给newString指针指向的内存区域不可用。此函数的调用方仍然可以通过返回的指针访问内存区域


注意:您必须检查malloc的返回值,因为它可能返回NULL。

您还将覆盖malloc的内存一个字节。。。不要忘记空字符终止符取一个;您需要在len中添加一个

您的问题是什么?您必须在C中管理自己的堆内存。因此,如果您在函数中分配了一些内存,但没有取消分配,那么它将一直保持分配状态,直到您的进程终止或在其他地方取消分配为止。
char* StringCopy(const char* string) {
    char* newString;
    int len;
    len = strlen(string) ;
    newString = malloc(sizeof(char)*len); 

    strcpy(newString, string); 
    return(newString); 
}