Tag: 堆栈

关于C / C ++堆栈分配

在学习C ++(和C)时,我对堆栈分配的工作有一些特别的疑问,我无法找到解决方案: 堆栈分配是否隐式调用malloc / free函数? 如果不; 如何确保堆栈分配和堆分配之间没有冲突? 如是; C ++中的堆栈分配是否也隐式调用new / delete? 如是; 重载一个类的new运算符会影响它的堆栈分配吗? 它在VC ++中产生了令人困惑的结果; 但由于VC ++并不完全符合标准(或者我听说过),我决定在这里问一下……

Carrays实例化 – 堆栈或堆分配?

我保证之前已经问过这个问题,但是我无法通过搜索找到它; 对于任何裁员,提前抱歉。 这是我(可能错误的)理解,只有在编译时知道对象的大小时才分配给堆栈。 因此,在初始化数组的情况下,您可以执行其中一个(这应该在堆栈上): char charArray[50]; 由于此数组的大小在编译时是已知的,因此应该没有问题。 另一方面,这(我相信)也是有效的代码: char anotherCharArray[someVariable + 50]; 这也会在堆栈上进行吗? 我很确定代码段错误如果你释放()这个,所以它让我觉得它确实如此,但它对我来说并没有多大意义。 同样,100%唯一的情况是,当通过malloc分配数据时,你必须使用free()? 在此先感谢您的帮助。

如何在C或Assembly中修改Stack上的返回地址

如您所知,当子程序调用时,当前PC(程序计数器)值存储在堆栈中。 我想在子程序中修改它,如下所示。 我希望使用gcc编译器在Intel Core-i7 3632QM上执行此操作。 void main() { foo(); } void foo() { pop return address from stack; modify return address; push it to stack; }

堆,堆栈,文本等不同的段如何与物理内存相关?

编译C程序并创建目标文件(ELF)时。 目标文件包含不同的部分,如bss,数据,文本和其他段。 我知道ELF的这些部分是虚拟内存地址空间的一部分。 我对吗? 如果我错了,请纠正我。 此外,将存在与编译的程序相关联的虚拟存储器和页表。 页表在加载程序时将ELF中存在的虚拟内存地址与实际物理内存地址相关联。 我的理解是否正确? 我在创建的ELF文件中读到,bss部分只保留未初始化的全局变量的引用。 这里未初始化的全局变量是指在声明期间未初始化的变量? 另外,我读到局部变量将在运行时(即堆栈中)分配空间。 那么它们将如何在目标文件中引用? 如果在程序中,有特定的代码段可用于动态分配内存。 如何在目标文件中引用这些变量? 我很困惑,目标文件的这些不同段(如文本,rodata,数据,bss,堆栈和堆)是物理内存(RAM)的一部分,其中所有程序都被执行。 但我觉得我的理解是错误的。 当进程或程序执行时,这些不同的段如何与物理内存相关?

为什么我在C中声明堆栈中的大型数组会得到段错误?

我从这行代码中得到了一个段错误: int fatblob[1820][286][5]; 这是为什么?

C / C +程序的最大堆栈大小?

我试过以下程序。 创建此程序的目的是发现有关堆栈大小的更多信息。 int main() { int nStack[100000000]; return 0; } 执行上面的代码后,程序因堆栈大小分配而崩溃。 堆栈的最大可能大小是多少? 它是否适用于每个程序/计算机? 可以增加吗? 我想知道为了知识。 如果任何人都可以在C / C ++中提供示例,那将非常有用。

堆栈大小估计

在multithreading嵌入式软件(用C或C ++编写)中,必须为线程提供足够的堆栈空间,以使其能够完成其操作而不会溢出。 在某些实时嵌入式环境中,正确调整堆栈大小至关重要,因为(至少在我使用过的某些系统中),操作系统不会为您检测到这一点。 通常,在创建线程时(即在pthread_create()等的参数中)指定新线程(除主线程之外)的堆栈大小。 通常,这些堆栈大小被硬编码为在最初编写或测试代码时已知良好的值。 但是,未来对代码的更改通常会破坏硬编码堆栈大小所依据的假设,并且在一个重要的日子里,您的线程进入其调用图的较深分支之一并溢出堆栈 – 从而导致整个系统崩溃或者默默地腐蚀记忆。 在线程中执行的代码在堆栈上声明struct实例的情况下,我个人已经看到了这个问题。 当结构体被扩充以容纳额外数据时,堆栈大小会相应地膨胀,从而可能发生堆栈溢出。 我想这对于已建立的代码库来说可能是一个巨大的问题,其中无法立即知道向结构添加字段的全部效果(太多的线程/函数来查找使用该结构的所有位置)。 由于对“堆栈大小”问题的通常响应是“它们不可移植”,因此我们假设编译器,操作系统和处理器都是此调查的已知数量。 我们也假设没有使用递归,所以我们没有处理“无限递归”场景的可能性。 有哪些可靠的方法可以估算线程所需的堆栈大小? 我更喜欢离线(静态分析)和自动方法,但欢迎所有想法。

堆栈内存上的free()

我在Solaris上支持一些c代码,至少我认为它是奇怪的: char new_login[64]; … strcpy(new_login, (char *)login); … free(new_login); 我的理解是,由于变量是本地数组,因此内存来自堆栈而不需要释放,而且由于没有使用malloc / calloc / realloc,因此行为未定义。 这是一个实时系统,所以我认为这是一个浪费周期。 我错过了一些明显的东西吗

如果我增加一个数组变量会怎么样?

我知道如果将指针的地址放在堆上是不安全的,因为以后释放它会导致一些麻烦,但如果在堆栈上声明指针,那么这样做是否安全? 我在谈论这样的事情: char arr[] = “one two three”; arr++; //or arr–; 我希望通过引用char数组作为指针来实现这一点。

为什么编译器在堆栈中分配的数量超过了需要?

我有一个简单的C程序。 比方说,我有一个长度为20的int和一个char数组。我总共需要24个字节。 int main() { char buffer[20]; int x = 0; buffer[0] = ‘a’; buffer[19] = ‘a’; } 堆栈需要与16字节边界对齐,因此我假设编译器将保留32个字节。 但是当我使用gcc x86-64编译这样的程序并读取输出程序集时,编译器会保留64个字节。 ..\gcc -S -o main.s main.c 给我: .file “main.c” .def __main; .scl 2; .type 32; .endef .text .globl main .def main; .scl 2; .type 32; .endef .seh_proc main main: pushq %rbp # RBP is pushed, […]