dynamic-memory-allocation 相关问题

动态内存分配,通常在没有垃圾收集或强制或自动引用计数的语言环境中,是指进程或向操作系统询问可变大小的内存块。

使用向量和数组在相同代码中的不同输出

这是C++代码 #包括 使用命名空间标准; 主函数() { 长整型_=1; 辛 >> _; 尽管(_ - ) { long long int n,i,even=0,odd=0; ...

回答 0 投票 0

使用 malloc 比声明变量数组以供运行时使用的方法有什么好处

考虑以下两个代码: #include 无效主要(){ 整数; scanf("%d",&num); 整数 arr[num]; 对于(int i=0;i 考虑以下两个代码: #include<stdio.h> void main() { int num; scanf("%d",&num); int arr[num]; for(int i=0;i<num;i++){ arr[i] = i+1; } } #include<stdio.h> #include<stdlib.h> void main() { int num; scanf("%d",&num); int*p=(int*)malloc(num*size of(int)); for(int i=0;i<num;i++){ *(p+i) = i+1; } } 以上两段代码都是为用户给定的大小为num的数组分配内存,然后初始化。但第一个是数组的大小是可变的,所以在编译时编译器提供一些内存空间,它不是(可能)恰好是 num 但可能更多但在运行时 num 大小被分配给它稍后. 虽然对于 malloc one 的情况,不存在最初分配随机内存空间这样的问题,因此我们可以说 malloc 在这个特性方面更好,因此更适合使用? 以上两段代码都是为用户给定的大小为num的数组分配内存,然后初始化 在第一种情况下,arr 被声明为局部变量,因此它使用堆栈中的内存,并且它仅在声明它的函数的持续时间内存在。如果该函数是 main,那么它当然会在程序的生命周期内存在,但是在其他具有更短生命周期的函数中以这种方式声明的数组同样具有更短的生命周期。 在第二种情况下,数组被声明为“动态”——它使用堆中的内存而不是堆栈中的内存,并且即使在创建它的函数退出后也将继续存在。因为程序的堆空间通常比堆栈空间多得多,所以使用 malloc 也很有用,因为它允许创建更大的数组。 因此,例如,程序对从一个文件或多个文件中读取的数据进行操作是很常见的。想象一下编写一个函数来打开一个文件,将数据读入一个数组,并将该数组返回给调用者。如果该函数将数组声明为局部变量,则当函数退出时它将超出范围,您将无法将其返回给调用者。或者,您可以让调用者创建数组并将其传递给读取数据的函数,但是调用者必须提前知道文件中有多少数据,这并不总是可能的。此外,程序员可能事先不知道有多少文件,因此可能会读取多少数组。如果您在每次调用文件读取函数时动态创建一个数组,那么所有这些问题都会消失:您为每个文件获得一个新数组,您可以轻松地将数组返回给调用者,并且可以调整数组的大小以适应文件中的数据量。 malloc()的可能优点: 它在超出范围后仍然存在(例如,您可以做myPointer = malloc(foo); return myPointer;但不能做int myArray[foo]; return myArray;)。 它通常可以毫无问题地处理更大的分配(可用堆几乎总是大于可用堆栈空间) 它允许您优雅地处理错误(通过在出现故障时返回NULL,而不是在像int myArray[foo];这样的事情导致您的堆栈溢出时导致未定义的行为)。 内存可以在分配后调整大小/重新分配。 malloc()的可能缺点: 分配和释放内存时通常较慢 由于局部性,使用内存时可能会变慢 为避免内存泄漏,您必须稍后对内存进行free(),并且绝不能对内存进行多次free()。这需要程序员付出一些额外的努力来保持跟踪(可能包括使用 valgrind 等工具来确保它是正确的)。

回答 2 投票 0

使用动态内存构建堆栈的问题 (C)

我正在尝试学习数据结构,因此我做了一个练习,我们从用户那里读取一个字符串,然后我们评估该字符串,以检查括号是否格式正确,例如 inp...

回答 2 投票 0

使用动态内存构建堆栈的问题 (C)

我正在尝试学习数据结构,因此我做了一个练习,我们从用户那里读取一个字符串,然后我们评估该字符串,以检查括号是否格式正确,例如 inp...

回答 0 投票 0

C++ 类的构造函数中的箭头运算符

我在 C++ 中的哈希表中工作,我希望动态分配它以支持表可能被声明为非常大的大小的情况。 代码正在运行,它看起来像: cl...

回答 2 投票 0

struct rest *r_list 表达式必须是可修改的左值

我正在制作一个恢复管理程序。我想删除动态分配给 detail_an_item() 的指针数组中对应于 rlist[index - 1] 的值,但出现此错误。我该如何解决

回答 1 投票 0

动态数组删除期间的分段错误[关闭]

我有两个班级。 Shape 是基类,Rect 是派生类。我创建了两个动态数组: 形状* pShapes = new Rect[10]; // 1) Rect* pRects = new Rect[10]; // 2) 然后在做了一些

回答 0 投票 0

为什么在使用 `munmap()` 后页面回收仍然存在?

对于一个研究项目,我必须使用 mmap() 和 munmap() 编写 malloc() 和 free() 的重新实现。 我在最后一个 Ubuntu 上运行。对于我的测试,我使用命令 time -v (from /usr/bin/time) w...

回答 1 投票 0

我使用动态分配和函数将二维矩阵相乘。为什么地址变了?

代码是利用A的列和B的行必须相同才能找到矩阵乘积的属性构造的。 当我在不使用动态分配的情况下乘以二维矩阵时它起作用了……

回答 1 投票 0

指针和指针哲学

如何准确理解我们在实际程序中如何以及在何处使用指针和引用。指针最大的哲学概念是什么。是的,我知道指针包含

回答 0 投票 0

表达式:_CrtlsValidHeapPointer(block) C++ matrix with MASM32

在 C++ 代码中,我为矩阵分配内存,并在代码中间的主版本结束时调用汇编程序插入过程 matrix_transformations。当我发布时我得到一个错误...

回答 1 投票 0

包含字符串值的结构在使用动态内存分配创建后导致其赋值时出现分段错误

编译器在以下代码上抛出运行时段错误: #包括 #包括 使用命名空间标准; 结构节点{ 整数数据; 无效*下一个; 字符串节点类型; }; ...

回答 4 投票 0

尝试初始化二维数组时出现分段错误

我不知道这里出了什么问题,当我尝试运行这段代码时出现段错误: #包括 int **alloc_grid(int 宽度, int 高度) { 诠释我,j; 诠释**网格; ...

回答 1 投票 0

取消引用返回 malloc 指针然后通过 & 符号传递变量地址的函数是否正确?

所以我在这里写了这个函数来学习我最近发现的一种分配二维数组的有趣方法: //############################## 单个数组矩阵 结构 sam *alloc_sam(结构 ...

回答 2 投票 0

Go 接口内存泄漏

Go 似乎没有正确释放基于接口的指针。 package main //接口内存泄漏 进口 ( “调频” “运行” ) 类型接口接口{方法(v任何)}

回答 2 投票 0

C访问冲突读取位置0xFFFFFFFFFFFFFFFF

我目前正在尝试测试我的代码以在列表中添加参与者,但我收到错误 访问冲突读取位置 0xFFFFFFFFFFFFFFFF。 当我尝试释放内存时。 参与者.h #

回答 1 投票 0

在这个二进制文件读取器中导致 bad_alloc 错误的原因是什么?

我的代码解释一个二进制文件并从中读取数据。 我无法找到此错误的原因。编译器终止并抛出 bad_alloc 错误;我想知道是否有记忆力...

回答 1 投票 0

C++ Linked List find() 工作起来很奇怪

我有两个结构 Invoice & InvoiceDetails 定义如下: 结构发票详细信息{ int 发票编号; 国际产品编号; 国际价格; 整数数量; }; 结构发票{ 内部编号; ...

回答 1 投票 0

当我在 c [重复] 中使用 free() 时程序崩溃

这个作业我真的需要帮助: “编写一个 void 类型的函数,它接受一个字符数组并创建两个新数组 (动态的)。其中一个函数复制小写字母让...

回答 1 投票 0

为什么memset失败而calloc成功?

我正在尝试初始化一个包含 26 个字符串的数组。我不希望将数组放在堆上,但是当我尝试使用 memset 将内存分配给数组时出现分段错误。代表的代码...

回答 5 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.