在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相同。
答案 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