加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C中的数组及其指针

发布时间:2020-12-16 05:04:31 所属栏目:百科 来源:网络整理
导读:老问题,但我仍然有一些想法. char * getarrmal(void){ char *str; str = (char *)malloc(10); str[0] = 'a'; str[1] = 'b'; str[2] = 'c'; str[3] = ''; return str;}char * getarrdef(void){ char *str = "hello"; return str;}char * getarrfix(void){ c
老问题,但我仍然有一些想法.
char * getarrmal(void)
{
    char *str;
    str = (char *)malloc(10);
    str[0] = 'a';
    str[1] = 'b';
    str[2] = 'c';
    str[3] = '';
    return str;
}

char * getarrdef(void)
{
    char *str = "hello";
    return str;
}

char * getarrfix(void)
{
    char str[10] = "world";
    return str;
}

三个功能.前两个将返回字符串地址,字符串存储在堆中,以便您可以继续使用它,例如main()函数.

在最后一个函数中,str是一个局部变量,并且不能使用返回的str.

我的问题是,当我返回调用前两个函数时,我应该手动释放它们吗?很容易相信malloc的情况确实如此,但我不确定它是否也是char * str =“hello”的情况.

如果我使用getarrdef()并且不释放它的返回值,那么我会以某种方式泄漏内存吗?

解决方法

不,你绝对不应该试图释放第二个.它不存储在堆中,而是一个字符串文字,并试图释放它是未定义的行为.来自C 11 7.21.3.3自由功能:

… if the argument does not match a pointer earlier returned by a memory management
function,or if the space has been deallocated by a call to free or realloc,the
behavior is undefined.

对于第一个,是的,分配内存的责任与内存本身一起传递是一种很好的做法.这意味着如果有东西分配给你并给你,那么你就有责任释放它.

即使您通过将其传递回像delarrmal()这样的函数来释放它也是如此 – 通过这样做,您已经赋予该函数以释放它的责任.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读