Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 已分配结构中未分配的数据类型_C_Pointers_Struct - Fatal编程技术网

C 已分配结构中未分配的数据类型

C 已分配结构中未分配的数据类型,c,pointers,struct,C,Pointers,Struct,假设我有这样一个结构定义: typedef struct Sample { int s; }Sample; 我声明一个指针变量,如下所示 Sample *sample = (Sample *)malloc(sizeof(Sample)); 现在我的问题是,“int”放在堆栈还是堆中?我的意思是“int s”也有动态内存分配吗?当您通过malloc为结构分配空间时,整个结构(即结构中包含的所有字段)都位于堆上。当您动态分配内存时,它总是从堆中获取。我猜答案就到此为止了它在堆上分配了一块

假设我有这样一个结构定义:

typedef struct Sample
{
    int s;
}Sample;
我声明一个指针变量,如下所示

Sample *sample = (Sample *)malloc(sizeof(Sample));

现在我的问题是,“int”放在堆栈还是堆中?我的意思是“int s”也有动态内存分配吗?

当您通过
malloc
结构分配空间时,整个
结构(即
结构中包含的所有字段)都位于堆上。

当您动态分配内存时,它总是从堆中获取。我猜答案就到此为止了

它在堆上分配了一块足够大的内存,可以容纳
样本
。假设您实际将
示例
放在那里,则
int
包含在其中。只有1个分配。(在本例中,它的大小将与一个
int
)的大小相同。内存在堆上以样本对象的大小分配。s是任何示例对象的数据成员,因此它位于堆上。(顺便说一下,既然这个问题用C++和C++来标记,只要FIY在C++中使用新的而不是Malc),那么我只能释放“int s”,而不是整个样本对象吗?如果是,如何传递?您只能传递到
free()
您从
malloc()
calloc()
realloc()
接收到的内容。代码没有从
malloc()
接收到
sample
,因此只有
sample
可以传递到
free())
在C中调用
malloc()
,1)时,不要强制转换返回值,它的“类型”已经是一个
void*
,可以分配给任何指针。强制转换只会使代码变得混乱,使其更难理解、调试和维护。2) 始终检查(!=NULL)返回值以确保操作成功。堆的正式名称是dynamic storage IIRC。感谢您的回复。由于整个内存都是从堆中取出的,我可以释放'int's吗?@Abdulkadir不,你可以释放部分结构。您只能将传递给
free
的内容传递给
malloc
。所以你不能
免费(&sample->s)
,你只能
免费(sample)