函数内使用malloc以及向量的问题

时间:2022-09-12 18:49:17
以下是我的代码片段:

#include <stdio.h>
#include <stdlib.h>

char *get_v()
{
    int i,a[8] = {1804289383,846930886,1681692777,1714636915,1957747793,424238335,719885386,1649760492};
    char *v;
    v = malloc(8);
    for(i=0;i<8;i++)
    {
        v[i] = a[i];
    }
//    free(v);
    return v;
}

int main()
{
    char *v1;
    v1 = get_v();
    /* 使用v1做的事情,此处省略 */
    free(v1);
}


以上代码中,get_v函数是想定义一个向量,在函数中使用了malloc,但没有free。
malloc跟free不在一个函数内,感觉很别扭啊
不知道在C语言中定义向量有没有其他方法呢?

12 个解决方案

#1


引用 楼主 soniclee 的回复:
malloc跟free不在一个函数内,感觉很别扭啊


堆上的空间就是如此管理的,只要malloc和free匹配就好。

#2


在C语言中这是常有的事
即使在C++中,标准模板库也不能解决所有问题,它只能解决最常见的问题,很多时候你一样要在一个函数里new在另一个函数里delete

比较常用的控制方法是,在设计程序结构时划分模块,在同一个模块的不同函数里申请和删除需要用于某个目的的内存,其他模块只应该调用这个模块内的函数,不能自己申请和删除内存
这样程序架构就比较明确,便于维护和修改代码,当然,假如碰上脑残程序员,你设计什么方法都没用

#3


那有没有更简单点定义向量的办法呢?

#4


不一定非要在一个函数,只要free的那个指针值是malloc返回的就可以了

#5


引用 3 楼 soniclee 的回复:
那有没有更简单点定义向量的办法呢?

要简单,就别学c/c++了
c/c++最常用的领域是底层,最大的特点是用程序员的高负荷换来程序运行的高效率,要简单去学java等重视开发效率的语言吧

#6


引用 5 楼 baichi4141 的回复:
Quote: 引用 3 楼 soniclee 的回复:

那有没有更简单点定义向量的办法呢?

要简单,就别学c/c++了
c/c++最常用的领域是底层,最大的特点是用程序员的高负荷换来程序运行的高效率,要简单去学java等重视开发效率的语言吧


那我是不是可以理解为,我这么定义向量的方法,是正确,且是唯一的?

#7


引用 6 楼 soniclee 的回复:
那我是不是可以理解为,我这么定义向量的方法,是正确,且是唯一的?

c语言没有对象的概念,更没有向量这种东西
要玩C语言就老老实实从内存开始思考

话说我讨厌向量这个模板名,进行数学运算的时候命名很头疼

#8


引用 6 楼 soniclee 的回复:
那我是不是可以理解为,我这么定义向量的方法,是正确,且是唯一的?


楼主这样是可以的,但是不建议这样做,编码风格不好。

如果楼主要在get_v函数外面free,建议就要在外面malloc了再将空间地址传进去。在getv里面malloc了就要尽量在getv里面free。确实存在很多情况,malloc和free在不同函数里面,那建议都封装起来,比如有个getv来做malloc,就再封装个freev来做free的动作。

#9


把free(v)放在一个函数releas_V()里,看起来就和get_v()配对了。

#10


只需要把malloc申请的空间的首地址给free函数就可以,不一定是初始的指针~

#11



malloc和free

fopen和fclose
那样用。

#12


配对比较好,不配对就必须,时刻记住分配了,要释放。
使用常了就习惯了。
比如你见一个链表,你不能刚建好就释放所有节点。
关键记住配对。
你定义一个创建函数,一个销毁函数。
并配对使用就行了。没有必要那么纠结。
如果是C++,可以封装一下。

#1


引用 楼主 soniclee 的回复:
malloc跟free不在一个函数内,感觉很别扭啊


堆上的空间就是如此管理的,只要malloc和free匹配就好。

#2


在C语言中这是常有的事
即使在C++中,标准模板库也不能解决所有问题,它只能解决最常见的问题,很多时候你一样要在一个函数里new在另一个函数里delete

比较常用的控制方法是,在设计程序结构时划分模块,在同一个模块的不同函数里申请和删除需要用于某个目的的内存,其他模块只应该调用这个模块内的函数,不能自己申请和删除内存
这样程序架构就比较明确,便于维护和修改代码,当然,假如碰上脑残程序员,你设计什么方法都没用

#3


那有没有更简单点定义向量的办法呢?

#4


不一定非要在一个函数,只要free的那个指针值是malloc返回的就可以了

#5


引用 3 楼 soniclee 的回复:
那有没有更简单点定义向量的办法呢?

要简单,就别学c/c++了
c/c++最常用的领域是底层,最大的特点是用程序员的高负荷换来程序运行的高效率,要简单去学java等重视开发效率的语言吧

#6


引用 5 楼 baichi4141 的回复:
Quote: 引用 3 楼 soniclee 的回复:

那有没有更简单点定义向量的办法呢?

要简单,就别学c/c++了
c/c++最常用的领域是底层,最大的特点是用程序员的高负荷换来程序运行的高效率,要简单去学java等重视开发效率的语言吧


那我是不是可以理解为,我这么定义向量的方法,是正确,且是唯一的?

#7


引用 6 楼 soniclee 的回复:
那我是不是可以理解为,我这么定义向量的方法,是正确,且是唯一的?

c语言没有对象的概念,更没有向量这种东西
要玩C语言就老老实实从内存开始思考

话说我讨厌向量这个模板名,进行数学运算的时候命名很头疼

#8


引用 6 楼 soniclee 的回复:
那我是不是可以理解为,我这么定义向量的方法,是正确,且是唯一的?


楼主这样是可以的,但是不建议这样做,编码风格不好。

如果楼主要在get_v函数外面free,建议就要在外面malloc了再将空间地址传进去。在getv里面malloc了就要尽量在getv里面free。确实存在很多情况,malloc和free在不同函数里面,那建议都封装起来,比如有个getv来做malloc,就再封装个freev来做free的动作。

#9


把free(v)放在一个函数releas_V()里,看起来就和get_v()配对了。

#10


只需要把malloc申请的空间的首地址给free函数就可以,不一定是初始的指针~

#11



malloc和free

fopen和fclose
那样用。

#12


配对比较好,不配对就必须,时刻记住分配了,要释放。
使用常了就习惯了。
比如你见一个链表,你不能刚建好就释放所有节点。
关键记住配对。
你定义一个创建函数,一个销毁函数。
并配对使用就行了。没有必要那么纠结。
如果是C++,可以封装一下。