Tag: 动态内存分配

为什么要使用_mm_malloc? (与_aligned_malloc,alligned_alloc或posix_memalign相对)

获取对齐的内存块有几个选项,但它们非常相似,问题主要归结为您所针对的语言标准和平台。 C11 void * aligned_alloc (size_t alignment, size_t size) POSIX int posix_memalign (void **memptr, size_t alignment, size_t size) 视窗 void * _aligned_malloc(size_t size, size_t alignment); 当然,手动对齐也是一种选择。 英特尔提供另一种选择 英特尔 void* _mm_malloc (int size, int align) void _mm_free (void *p) 根据英特尔发布的源代码,这似乎是分配工程师喜欢的对齐内存的方法,但我找不到任何将其与其他方法进行比较的文档。 我发现的最接近的只是承认存在其他对齐的内存分配例程。 https://software.intel.com/en-us/articles/memory-management-for-optimal-performance-on-intel-xeon-phi-coprocessor-alignment-and 要动态分配一块对齐的内存,请使用posix_memalign,它由GCC和Intel Compiler支持。 使用它的好处是您不必更改内存处理API。 您可以像往常一样使用free()。 但要注意参数配置文件: int posix_memalign(void ** memptr,size_t align,size_t size); 英特尔编译器还提供另一组内存分配API。 C / […]

如何在C中读取无限字符

如何在不指定大小的情况下将无限字符读入char*变量? 例如,假设我想要读取可能也需要多行的员工的地址。

访问动态分配的arrays的越界元素/没有SegFault

我正在用C开发一个程序,它使用一组链表(一个原始哈希表)作为数据类型来表示某些日期信息。 该数组有12个元素,对应于一年中的月份,每个月都有一个包含数据节点的链表。 我开发了使用此数据类型的模块,它工作正常。 我后来发现我正在访问超出界限的数组元素(例如,通过索引12而不是11来访问第12个元素)。 但该计划始终如一地顺利进行。 我从未收到过分段错误。 我已经纠正了编码错误。 有人可以解释为什么访问越界元素不会导致段错误吗? 这不是第一次发生。 我创建了一个动态分配的多维数组,为了测试,我试图访问越界元素。 该程序运行良好,产生了准确的结果,并且在大多数情况下没有出错。 我唯一一次实现一个,我不得不尝试访问大量的越界元素。 (这些程序目前是用于测试的Windows控制台应用程序。我正在使用MinGW进行编译。如果有帮助,我可以包含代码。)

我如何使用结构?

好的,首先我会解释我的任务。 对于这个分配,我必须使用动态内存分配,我没有遇到任何问题。 我遇到的问题是弄清楚正确的工作方式。 对于我的任务,我需要创建一个程序,提示用户输入他们有多少学生然后要求提供以下信息; 学生证,出生日期和电话号码。 我需要使用循环来提示用户输入所有学生信息。 我需要创建一个循环,它将扫描所有学生ID并使用他们的生日找到最老的学生(循环必须能够扫描超过3名学生)。 这是我的代码,我已经从你们那里获得了一些建议甚至一些代码,但是在实现它们之后,我对我应该做的事情更加困惑。 请看一看并批评我。 编辑:我还添加了我收到的代码和错误 谢谢。 #include #include int main (void) { int * studentData= NULL; int * studentDataType=NULL; int students; int studentID; int year; int month; int day; long long phone; printf(“How many students are you entering records for:\n”); scanf(“%d”, &students); studentData=(int*)malloc((sizeof(int)*students)); struct studentDataType { int studentID; int year; […]

MPI中的动态内存分配

我是MPI的新手。 我写了一个简单的代码来显示使用多个进程的矩阵。 如果我有一个8×8的矩阵并用4个进程启动MPI程序,我的第1个进程将打印第2个2行,第2个线程将由第2个线程打印,然后将其自身分开。 #define S 8 MPI_Status status; int main(int argc, char *argv[]) { int numtasks, taskid; int i, j, k = 0; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &taskid); MPI_Comm_size(MPI_COMM_WORLD, &numtasks); int rows, offset, remainPart, orginalRows, height, width; int **a; // int a[S][S]; if(taskid == 0) { cout<<taskid<<endl; height = width = S; a = (int **)malloc(height*sizeof(int […]

C:向动态分配的数组添加元素

我试图通过谷歌搜索一个解决方案:我找不到任何有帮助的东西; 它甚至看起来好像我正确地这样做了。 我能找到的关于通过函数发送动态分配的数组的唯一页面处理的是一个结构内部的数组,当然是标量,所以表现不同。 我现在不想使用结构 – 我正在尝试学习DAM并使用指针和函数。 那就是说,我确信这是非常基本的,但我被困住了。 代码编译,但是当我运行可执行文件时它会冻结。 (我正在使用minGW gcc,如果这很重要。而且我现在还不清楚如何使用gdb。) 这是代码(最终,我希望整个代码是类似ArrayList的数据结构): #include #include void add( int element, int *vector); void display_vector( int *vector ); void initialize_vector( int *vector ); int elements = 0; int size = 10; int main(void) { int *vector = 0; initialize_vector(vector); add(1, vector); //add(2, vector); //add(3, vector); //add(4, vector); //add(5, vector); […]

动态分配用户输入的字符串

我正在尝试编写一个执行以下操作的函数: 启动输入循环,每次迭代打印’> ‘ 。 取用户输入的任何内容(未知长度)并将其读入字符数组,必要时动态分配数组的大小。 用户输入的行将以换行符结束。 在字符数组的末尾添加一个空字节’\0’ 。 当用户输入一个空行时,循环终止: ‘\n’ 这是我目前写的: void input_loop(){ char *str = NULL; printf(“> “); while(printf(“> “) && scanf(“%a[^\n]%*c”,&input) == 1){ /*Add null byte to the end of str*/ /*Do stuff to input, including traversing until the null byte is reached*/ free(str); str = NULL; } free(str); str = NULL; } […]

简单的C实现跟踪内存malloc / free?

编程语言:C平台:ARM编译器:ADS 1.2 我需要在项目中跟踪简单的melloc/free通话。 我只需要了解程序分配了所有资源后需要多少堆内存的基本概念。 因此,我为malloc/free调用提供了一个包装器。 在这些包装器中,我需要在调用malloc时增加当前内存计数,并在调用free时减少它。 malloc案例是直截了当的,因为我有从调用者分配的大小。 我想知道如何处理free案例,因为我需要在某处存储指针/大小映射。 这是C,我没有标准的地图来轻松实现这一点。 我试图避免在任何库中链接,所以更喜欢* .c / h实现。 所以我想知道是否已经有一个简单的实现可能会引导我。 如果没有,这是继续实施的动机。 编辑:纯粹用于调试,此代码不随产品提供。 编辑:根据Makis的回答进行初步实施。 我很感激对此的反馈。 编辑:重新实施 #include #include #include #include #include static size_t gnCurrentMemory = 0; static size_t gnPeakMemory = 0; void *MemAlloc (size_t nSize) { void *pMem = malloc(sizeof(size_t) + nSize); if (pMem) { size_t *pSize = (size_t *)pMem; memcpy(pSize, &nSize, […]

为什么或何时需要在C中动态分配内存?

动态内存分配是C编程中非常重要的主题。 但是,我无法找到一个很好的解释,这使我们能够做到这一点,或者为什么需要这样做。 我们不能只声明变量和结构,而不必使用malloc()吗? 作为旁注,有什么区别: ptr_one = (int *)malloc(sizeof(int)); 和 int *ptr_one = malloc(sizeof(int));

2D和3Darrays的动态分配/释放

我知道动态分配/解除分配2D数组的算法,但是对于3D数组我也不太清楚。 利用这些知识和一点对称性,我想出了以下代码。 (我在编码期间很难在3D中进行可视化)。 请评论正确性并建议任何更好的替代方案(效率方面或直观方面),如果有的话。 此外,我认为这些2D和3D数组都可以正常访问,如静态数组,如arr2D [2] [3]和 arr3D [2] [3] [2]。 对? 二维码 //allocate a 2D array int** allocate2D(int rows,int cols) { int **arr2D; int i; arr2D = (int**)malloc(rows*sizeof(int*)); for(i=0;i<rows;i++) { arr2D[i] = (int*)malloc(cols*sizeof(int)); } } //deallocate a 2D array void deallocate2D(int** arr2D,int rows) { int i; for(i=0;i<rows;i++) { free(arr2D[i]); } free(arr2D); } 3D代码 //allocate […]