关于结构体的内存分配与释放的问题

timidsmile 2012-07-17 05:09:31
现有一个结构体:


typedef struct _ScPoint
{
int x;
int y;
}
ScPoint;


函数:


inline ScPoint scPoint(int x, int y)
{
ScPoint p;
p.x = x;
p.y = y;
return p;
}



=====================================================

那,我每次需要使用一个点的时候,

ScPoint p = scPoint(3, 5);

这样可以么?不需要malloc么?释放呢?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
还有,


我需要一个数组

ScPoint vector[10];

那么vector怎么申请内存呢?又是怎么释放内存呢?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·

(如果是平时的指针的结构体的话,应该是这样的吧?vector = (ScPoint *)malloc(sizeof(ScPoint) * 10);
释放是 直接 free(vector); 还是需要一个个的释放 vector 里面的 ScPoint呢? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~额 当然,也不是指针。。。数组的话,又是怎么申请、释放内存呢?)
...全文
458 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
timidsmile 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

1:vector function(XXX)返回的东西是拷贝内容的,你用于承接返回值的变量也是在函数栈里,不需要自己控制内存分配。
2:你在写ScPoint vector[10]的时候,就有这么大的内存分配在函数栈里(或者全局空间,如果你写在外面)。
[/Quote]


喔喔喔~~ 明了~~~ 嘿嘿 ~ 3Q
timidsmile 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

此外,c 标准规定函数可以返回“结构体”,(结构体可以赋值),但函数不能返回数组,只能返回指针,
因此可以断定 符合标准的 compiler 应该有 类似的 “拷贝构造函数和赋值函数”
[/Quote]

soga soga~ 哈~ 越扯越远了呢~~不过学到好多东西~ CSDN真是好地方~可惜我的积分都挥霍掉了~ 555~~
jiandingzhe 2012-07-18
  • 打赏
  • 举报
回复
1:vector function(XXX)返回的东西是拷贝内容的,你用于承接返回值的变量也是在函数栈里,不需要自己控制内存分配。
2:你在写ScPoint vector[10]的时候,就有这么大的内存分配在函数栈里(或者全局空间,如果你写在外面)。
AnYidan 2012-07-18
  • 打赏
  • 举报
回复
此外,c 标准规定函数可以返回“结构体”,(结构体可以赋值),但函数不能返回数组,只能返回指针,
因此可以断定 符合标准的 compiler 应该有 类似的 “拷贝构造函数和赋值函数”
AnYidan 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

首先呢,建议楼主不要把函数的名称和变量名称搞成一样的。看的别扭。
数组,变量什么的直接定义就可以了,其存储在栈区间内;如果你使用指针需要使用malloc进行动态分配内存,存储在堆空间内
[/Quote]

++
AnYidan 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

首先呢,建议楼主不要把函数的名称和变量名称搞成一样的。看的别扭。
数组,变量什么的直接定义就可以了,其存储在栈区间内;如果你使用指针需要使用malloc进行动态分配内存,存储在堆空间内
[/Quote]

++
timidsmile 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

提供拷贝构造函数和赋值函数
[/Quote]


啊 这么麻烦啊。。。。我就是想用点 C 简单的结构体呢。。。。(⊙o⊙)…
ouyh12345 2012-07-17
  • 打赏
  • 举报
回复
提供拷贝构造函数和赋值函数
timidsmile 2012-07-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

参考:
一个进程在内存中的布局

这篇文章讲了各种变量、常量在内存中的位置,有兴趣者可以参考一下。
[/Quote]


3Q ~~ 最头疼的就是内存出问题了。。。。。。。%>_<%
timidsmile 2012-07-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 3 楼 的回复:

引用 1 楼 的回复:

首先呢,建议楼主不要把函数的名称和变量名称搞成一样的。看的别扭。
数组,变量什么的直接定义就可以了,其存储在栈区间内;如果你使用指针需要使用malloc进行动态分配内存,存储在堆空间内


全局的不在 栈 中? 但,还是由系统 来 分配 与 回收内存 ,还是不用操心它,是这个意思么?


(%>_<% 那我的程序为嘛老 崩 掉~~~~~~~~~~~ 我还以为是这的问题。。。。。。)



如果我需要使用的数组是 全局 的~~

比如定义全局变量 ScPoint vector[10];

然后某个函数中
……
[/Quote]
pathuang68 2012-07-17
  • 打赏
  • 举报
回复
参考:
一个进程在内存中的布局

这篇文章讲了各种变量、常量在内存中的位置,有兴趣者可以参考一下。
timidsmile 2012-07-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

第一个问题:
C/C++ code

typedef struct _ScPoint
{
int x;
int y;
}
ScPoint;

inline ScPoint scPoint(int x, int y)
{
ScPoint p;
p.x = x;
p.y = y;
return p;
}
int main()
{
ScPoi……
[/Quote]






soag ~ 是说 数组内存的 申请与释放 都是系统完成的么?

如果 数组,和普通的一个结构体变量 要是 全局 的(全局的,是不是意味着不存在栈上了,那有没有什么影响呢?), 也没有关系么?

数组的类型是 结构体 ,也没有什么影响么?
pathuang68 2012-07-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 1 楼 的回复:

首先呢,建议楼主不要把函数的名称和变量名称搞成一样的。看的别扭。
数组,变量什么的直接定义就可以了,其存储在栈区间内;如果你使用指针需要使用malloc进行动态分配内存,存储在堆空间内




如果我需要使用的数组是 全局 的~~

比如定义全局变量 ScPoint vector[10];

然后某个函数中
add_to_vector(v……
[/Quote]
嗯,全局的,的确不在栈中,程序退出的时候,就被操作系统收回去了。
夏天__ 2012-07-17
  • 打赏
  • 举报
回复
程序自动生成 的存在栈里面;

用户malloc生成的存在堆里面;

全局变量也是栈;

[Quote=引用 3 楼 的回复:]

引用 1 楼 的回复:

首先呢,建议楼主不要把函数的名称和变量名称搞成一样的。看的别扭。
数组,变量什么的直接定义就可以了,其存储在栈区间内;如果你使用指针需要使用malloc进行动态分配内存,存储在堆空间内




如果我需要使用的数组是 全局 的~~

比如定义全局变量 ScPoint vector[10];

然后某个函数中
add_to_vector(v……
[/Quote]
夏天__ 2012-07-17
  • 打赏
  • 举报
回复
1楼的很正确:数组,变量什么的直接定义就可以了,其存储在栈区间内;如果你使用指针需要使用malloc进行动态分配内存,存储在堆空间内


ScPoint vector[10];在函数结束的时候就空间自动释放,
timidsmile 2012-07-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

首先呢,建议楼主不要把函数的名称和变量名称搞成一样的。看的别扭。
数组,变量什么的直接定义就可以了,其存储在栈区间内;如果你使用指针需要使用malloc进行动态分配内存,存储在堆空间内
[/Quote]



如果我需要使用的数组是 全局 的~~

比如定义全局变量 ScPoint vector[10];

然后某个函数中
add_to_vector(vector, point);



这种时候,怎么办呢? 全局的,,,,,不应该存在 栈 里了吧。。。。。。。。。
夏天__ 2012-07-17
  • 打赏
  • 举报
回复
第一个问题:

typedef struct _ScPoint
{
int x;
int y;
}
ScPoint;

inline ScPoint scPoint(int x, int y)
{
ScPoint p;
p.x = x;
p.y = y;
return p;
}
int main()
{
ScPoint p = scPoint(3,4);
printf("%d-%d\n",p.x, p.y);
}
//3-4, 这样是可以的

你在写这个数组的时候,实际上系统已经申请了内存,不需要在申请内存,
只有操作指针时候,才要考虑申请释放内存;
ScPoint vector[10];


W170532934 2012-07-17
  • 打赏
  • 举报
回复
首先呢,建议楼主不要把函数的名称和变量名称搞成一样的。看的别扭。
数组,变量什么的直接定义就可以了,其存储在栈区间内;如果你使用指针需要使用malloc进行动态分配内存,存储在堆空间内

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧