堆栈和堆在编程语言中

时间:2015-11-26 05:23:40

标签: c# c stack heap

在C99中,以下代码行在堆栈上创建一个变量ptr,指向堆上的内存区域。

//Within the cellForRowAtIndexPath method:

    //  HERE IS WHERE I BELIEVE IS THE CAUSE OF TEXT DISAPPEARING DUE TO MEMORY ALLOCATION.
    attString = [[NSMutableAttributedString alloc] init];
    [attString appendAttributedString:[[NSAttributedString alloc] initWithString:@"@"  attributes:dict1]];
    [attString appendAttributedString:[[NSAttributedString alloc] initWithString:senderName   attributes:dict1]];
    [attString appendAttributedString:[[NSAttributedString alloc] initWithString:@" posted "      attributes:dict2]];
    [attString appendAttributedString:[[NSAttributedString alloc] initWithString:recepientName      attributes:dict2]];
    [attString appendAttributedString:[[NSAttributedString alloc] initWithString:@"."      attributes:dict2]];

    [cell.profileIDButton setAttributedTitle:attString forState:UIControlStateNormal];

堆栈和堆的定义在哪里?我在C99语言规范中找不到它们。

是否由操作系统或指令集架构或其他东西定义了堆栈和堆?

另一个相关的问题是C#中堆栈和堆的概念是否与C99中的概念完全相同?由于C#代码在.Net框架上运行,我不确定该概念是否与C99相同。

2 个答案:

答案 0 :(得分:6)

Stacks和堆是实现细节;就像你发现的那样,C语言定义根本没有提到它们。

C语言定义讨论了对象的存储持续时间。存储持续时间auto的对象的生命周期延伸到其封闭块上;事实上,硬件堆栈使得该行为易于实现,因此几乎所有C实现都这样做。存储时间allocated的对象的生命周期从malloc / calloc / realloc调用延伸到调用free。同样,几乎所有C实现都利用系统堆来实现该行为。

但是,实现不 使用系统提供的堆栈或堆来满足对象存储持续时间要求;这只会是一项工作。

答案 1 :(得分:1)

堆是分配给在计算机上运行的给定进程的内存量。堆栈通常是较小的内存量,分配给当前在给定进程上运行的线程。

创建局部变量时,它会存储到堆栈中。这种内存选择称为堆栈,因为在处理作用域时,可以像在堆栈数据结构中那样从可寻址空间中推送或弹出不同的值。

然后当你对malloc进行malloc时,它会被存储到堆中,因此甚至可以保存在多个范围内。

请注意,当您使用它们时,存储在堆上的内容必须是免费的,而操作系统会自动处理堆栈中的内容。

结帐http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html