Tag: 动态内存分配

用realloc缩小

我在这个问题中遇到了这段小代码,想知道, 当指向的内存空间缩小时, realloc()函数是否可以将内存块移动到另一个位置? int * a = malloc( 10*sizeof(int) ); int * b = realloc( a, 5*sizeof(int) ); 如果可能的话,在什么条件下,我可以期望b的地址与b中的地址不同吗?

在函数内使用realloc

我很抱歉,我知道很多相关的问题已经被问到了,所以我会保持简单。 尽管经过了多年的编程,我找不到正确的语法来调整和修改函数内的数组(或几个)。 例如,假设我想要一个函数用一组“n”数字填充数组,其中“n”在数组中定义: int main(int argc, char *argv[]) { float *data = NULL int n = myfunction(data); for(i=0;i<n;i++) printf("%f\n",data[i]); free(data); } int myfunction(float *input) { int i,n=10; input = (float *) realloc( input, n*sizeof(float) ); if(input!=NULL) { for(i=0;i<n;i++) input[i] = (float)i; return(n); else return(-1) } 我知道这不会起作用,因为我可能需要使用指向指针的指针,但我无法解析指针的哪个组合,指针到指针以及地址表示法在函数内部和外部使用。 任何简单的建议赞赏!

如何安排自定义标记扫描收集器的收集周期?

我为Postscript虚拟机编写了一个简单的垃圾收集器,我很难设计一套适当的规则来何时进行收集(当空闲列表太短时?)以及何时分配新空间(当有很多空间可供使用?)。 到目前为止,我自下而上写过,但这个问题涉及顶级设计。 所以我觉得我处于不稳定的状态。 所有对象都是通过操作员函数进行管理和访问的,因此这是C中的收集器,而不是C中的收集器。 主分配器函数称为gballoc : unsigned gballoc(mfile *mem, unsigned sz) { unsigned z = adrent(mem, FREE); unsigned e; memcpy(&e, mem->base+z, sizeof(e)); while (e) { if (szent(mem,e) >= sz) { memcpy(mem->base+z, mem->base+adrent(mem,e), sizeof(unsigned)); return e; } z = adrent(mem,e); memcpy(&e, mem->base+z, sizeof(e)); } return mtalloc(mem, 0, sz); } 我确定在不知道所有类型和函数意味着什么的情况下是乱码,所以这里是相同函数的伪代码: gballoc load free list head into […]

如果没有连续的内存空间,realloc会怎么做?

realloc用于动态重新分配内存。 假设我使用malloc函数分配了7个字节,现在我想将它扩展到30个字节。 如果内存中没有30个字节的顺序(连续单行)空间,后台会发生什么? 是否有任何错误或内存将被分配?

双指针vs指针数组(**数组vs * array )

我不清楚这些之间有什么区别2.我的教授写道**数组与* array []相同,我们得到一个例子,他用**数组(所以在课后我尝试用* array交换它] ]它没有用),谁能告诉我这些2是否与他写的一样? 无论如何,这个类是关于动态内存分配的 @一旦我改变了双指针,这一行开始抛出错误 lines = malloc(sizeof(char*)); 以及其他一些内存正在重新分配的地方 @ 2地狱耶,这是整个代码 对于那些评论,但是因为他的陈述是,所以内部没有任何内容 **array = *array[] 大更新 对于给您带来的任何不便,我感到非常抱歉,在写这篇文章时我太累了,这里是整个代码,没有编辑 #include #include #include char **lines; // global text buffer, organized as an array of lines // ——————————————————————————– // initialize global buffer void initialize() { lines = malloc(sizeof(char*)); lines[0] = NULL; } // ——————————————————————————– // return number […]

指针数组的动态内存分配

我正在尝试编写一个程序,该程序从文本文件中读取一系列字符串,并将它们存储在字符串数组中,为每个元素动态分配内存。 我的计划是使用指针将每个字符串存储在一个数组中,然后在读入更多数据时增大数组大小。我很难理解为什么我的测试代码无效。 这是一个可行的想法吗? char *aPtr; aPtr =(char*)malloc(sizeof(char)); aPtr[0]=”This is a test”; printf(“%s”,aPtr[0]);

由`malloc()`分配的内存有哪些内容?

在使用malloc()分配内存空间后,我很清楚指针究竟是什么? 该联机帮助页告诉我calloc()用零初始化分配的内存空间。 malloc()函数分配大小字节并返回指向已分配内存的指针。 内存未初始化 。 如果size为0,则malloc()返回NULL或一个以后可以成功传递给free()的唯一指针值。 和 calloc()函数为每个大小为字节的nmemb元素数组分配内存,并返回指向已分配内存的指针。 内存设置为零 。 如果nmemb或size为0,则calloc()返回NULL或一个以后可以成功传递给free()的唯一指针值。 我在C中为C(haha)创建了一个非常简短的示例程序: int main() { char *dynamic_chars; unsigned amount; printf(“how much bytes you want to allocate?\n”); scanf(“%d”, &amount); dynamic_chars = (char*)malloc(amount*sizeof(char)); printf(“allocated:\n%s\n”, dynamic_chars); free(dynamic_chars); return 0; } 但是,在执行此代码时,它只输出任何内容。 如果我初始化内存我自己,例如使用循环使用0xFFFF初始化每个字节,那么程序会向我显示我期望的内容。 内存空间实际存在,因为我不会收到错误声称我正在尝试访问未初始化的变量。 由于内存空间通常不会被删除但被标记为可重写,我想知道通过执行我的程序,我是否应该能够看到以前使用过的随机内存字节? 但我什么都看不到,所以我对malloc()工作原理感到困惑。 EDIT1 关于malloc()或者一般内存使用的另一件事,我的程序很有趣:如果我使用calloc()来分配内存,我可以通过监视来跟踪程序的实际内存使用情况。 例如,如果我告诉我的程序,为每个calloc()分配1.000.000.000字节的内存,我将在我的系统监视器中看到以下内容: <img src="http://sofzh.miximages.com/c/sQMHq.png" alt="使用 calloc()时的内存消耗”> 你可以想象,当使用malloc() ,我什么也看不见。 我明白,仅仅通过分配内存,我当时并没有真正使用它,但我仍然感到困惑的是为什么我的操作系统(unix衍生物)不会将其识别为使用它。 因为malloc()就像calloc()将物理地址返回到我没有得到的内存位置,这个内存区域似乎实际上并没有被操作系统保留。 那么我可以在系统监视器中看到它吗? 如果我想将此作为一个新问题发布,请告诉我。 […]

GPU上的内存分配用于动态结构数组

将struct数组传递给gpu内核时遇到问题。 我基于这个主题 – cudaMemcpy分段错误 ,我写的是这样的: #include #include struct Test { char *array; }; __global__ void kernel(Test *dev_test) { for(int i=0; i < 5; i++) { printf("Kernel[0][i]: %c \n", dev_test[0].array[i]); } } int main(void) { int n = 4, size = 5; Test *dev_test, *test; test = (Test*)malloc(sizeof(Test)*n); for(int i = 0; i < n; i++) […]

使用运算符new / malloc分配的内存块是否可以在程序执行结束后持续存在?

可能重复: 退出C应用程序时,是否自动释放了malloc-ed内存? 当我读到关于在C / C ++中动态内存分配时分别使用delete / free是多么强制时,我才想到这个问题。 我想如果内存分配持续超出我的程序执行终止,那么是的,它是强制性的; 否则,为什么我要担心释放分配的空间? 操作系统是否会在进程终止时自动释放它? 我有多难? 我的问题是可以的 int *ip = new int(8); 坚持超越我的计划终止?

Malloc函数(动态内存分配)在全局使用时导致错误

#include #include char *y; y=(char *)malloc(40); // gives an error here int main() { strcpy(y,”hello world”); } error: conflicting types for ‘y’ error: previous declaration of ‘y’ was here warning: initialization makes integer from pointer without a cast error: initializer element is not constant warning: data definition has no type or storage class warning: passing […]