我可以获取堆结尾的地址sbrk(0),但有没有办法以编程方式获取堆的起始地址,而不是通过解析内容/proc/self/maps?
人们谈论堆栈和堆是什么以及它们之间的差异.但我很想知道如果一个CPU不支持堆栈和堆结构,那么C可以在没有堆栈和堆的情况下正常运行吗?
例如,我可以做
int *arr;
arr = (int *)malloc(sizeof(int) * 1048575);
Run Code Online (Sandbox Code Playgroud)
但如果没有程序崩溃,我不能这样做:
int arr[1048575];
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
我写的代码如下:
while(true) {
int array[5];
// do something
}
Run Code Online (Sandbox Code Playgroud)
对于循环的每个回合,该数组是一个新数组.我是否需要在循环结束时删除数组?
我有几个与数组相关的问题.我已经研究过,数组大小必须是常量的,声明/编译器必须知道它的值.但是使用GNU GCC编译器(C++ 11标准过滤器),我能够使用变量作为数组大小完美地编译和运行程序,同时动态声明所述数组(使用new)
int num;
cout << "How big an array? ";
cin >> num;
int *arr = new int [num];
Run Code Online (Sandbox Code Playgroud)
问题1)这被认为是标准吗?我的教授是矛盾的.
Ques2)如果它是标准的,那么在创建之后是否可以扩展数组(或任何数组)的大小?
Ques3)同样,如果这个表达式是标准的,那么是否可以在函数中使用它 - 例如.使用函数创建这样的数组?(如果是这样,怎么样?)
(PS:嗨,我是新手,也是C++的新手)
可能重复:
堆栈和堆的内容和位置
我安装的Ubuntu的默认堆栈大小限制为8 MB.但我很好奇为什么我们需要限制用户程序的堆栈大小.同一个程序可以通过malloc/mmap等使用它的所有4 GB(32位程序)可寻址空间.那么为什么我们需要一个堆栈大小限制呢?为什么堆栈不能增长直到它几乎遇到堆?
我正在尝试时间和比较排序算法.根据我的理解:sizeof(int)是4个字节,因此int array[one million];产生(4)百万字节,大概是4,000 kb或4mb.
那我为什么不能呢?我很确定我还有更多.准确地说是2gb.
如果这意味着什么,我正在使用gcc.
为什么我会在没有malloc的情况下完成相同的工作时使用malloc,如下所示.
#include <stdio.h>
#include <conio.h>
struct node {
int data;
struct node *l;
struct node *r;
};
int main(){
//Case 1
struct node n1;
n1.data = 99;
printf("n1 data is %d\n", n1.data);
//Case 2
struct node *n2 = (struct node *) malloc (sizeof(struct node));
n2 -> data = 4444;
printf("n2 data is:%d\n",n2 -> data);
free(n2);
return (0);
}
Run Code Online (Sandbox Code Playgroud)
请考虑以下事项:
A a;
class B; // No content for brevity
class A
{
public:
A()
{
b.SetTitle("hi");
}
private:
B b;
}
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是在b内部A声明的是在堆上还是在堆栈上声明.
如果在堆上,这是否意味着它被自动删除或者我也必须删除它?
问题:
这就是我最初的做法,但我认为我有点愚蠢,因为我不得不一直宣称所有的东西都是新的...如果上面是堆栈,我想它不是那么愚蠢吧?
A a;
class B; // No content for brevity
class A
{
public:
A()
{
this->b( new B() ); // I don't have C++ 14 :( so i can't do make_unique
b->SetTitle("hi");
}
private:
unique_ptr<B> b;
}
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud) 在C99中,以下代码行在堆栈上创建一个变量ptr,它指向堆上的内存区域.
int *ptr = (int*)malloc(sizeof(int)*10);
Run Code Online (Sandbox Code Playgroud)
堆栈和堆的定义在哪里?我在C99语言规范中找不到它们.
堆栈和堆是由操作系统或指令集架构还是其他什么定义的?
另一个相关问题是C#中堆栈和堆的概念是否与C99中的概念完全相同?由于C#代码在.Net框架上运行,我不确定该概念是否与C99相同.