Tag: 内存管理

我该如何在C库中返回二元运算函数的结果?

我正在研究一个C库,其中一部分涉及一些数学类型并操纵它们。 每种类型都有一个工厂构造函数/析构函数,可以动态分配和释放它们。 例如: /* Example type, but illustrates situation very well. */ typdef struct { float x; float y; float z; } Vector3D; /* Constructor */ Vector* Vector3D_new(float x, float y, float z) { Vector3D* vector = (Vector3D*) malloc(sizeof(Vector3D)); /* Initialization code here…*/ return vector; } /* Destructor */ void Vector3D_destroy(Vector3D* vector) { free(vector); } […]

我应该使堆栈段大或堆段大吗?

我正在为内存非常有限的微处理器编程设计,我必须在不同的function中使用“大量”内存。 我不能有一个大的堆栈段,堆段,数据段,我必须选择哪个做大,哪个做小。 我总共大约32KB, 我使用大约20KB的文本段,其余为12KB。 我需要一个4KB的缓冲区来传递给不同的函数(SPI Flash扇区大小)。 应该在哪里初始化那个大缓冲区? 所以我的选择是: 1)如果我在函数的开头声明缓冲区,则需要使堆栈变大 spiflash_read(…) { u8 buffer[4096]; // allocated on stack syscall_read_spi(buffer,…) } 2)动态分配,堆需要变大 spiflash_read(…) { u8 *buffer = (u8*) malloc(4096); // allocated in heap syscall_read_spi(buffer,…) } 3)静态分配,巨大的下方不能在“SPI库”之外使用。 static u8 buffer[4096]; // allocated in data section. spiflash_read(…) { syscall_read_spi(buffer,…) } 我的问题是哪种方法是实现这种设计的最佳方式? 有人可以解释一下推理吗?

如何使用winpcap分配内存以发送高性能的大型pcap文件(大小大于可用内存)?

我使用了winpcap示例中的代码发送pcap文件(来自此链接的 winpcap文档的原始代码) 它可以很好地发送一个小的pcap文件,但如果我试图发送一个大的pcap文件(大于可用内存大小说2 Gb)它肯定会失败。 此代码用于在内存中分配文件的大小,以便稍后发送 caplen= ftell(capfile)- sizeof(struct pcap_file_header); … /* Allocate a send queue */ squeue = pcap_sendqueue_alloc(caplen); 问题是如何使这个工作适用于大型文件(Gb或大于可用于分配的最大内存空间)? 我应该只分配100 Mb,然后发送队列然后接下来的100Mb? 如果是,什么是适当的缓冲区大小? 怎么做? 这里一个重要的问题是发送此文件的性能需要尽可能快地完成(我正在发送video数据包)。 总之如何管理内存来实现这一目标? 有人会有适当的解决方案或建议吗? 示例代码中的代码段(此问题的不必要代码替换为…) … #include #include … void main(int argc, char **argv) { pcap_t *indesc,*outdesc; … FILE *capfile; int caplen, sync; … pcap_send_queue *squeue; struct pcap_pkthdr *pktheader; u_char *pktdata; … […]

从C函数返回字符串

我有一个简单的代码。 #define MY_STRING “String example” char* string_return_function() { return MY_STRING; } 上面的代码有效,但我不知道如何。 我认为string_return_function()返回一个本地地址,一旦该函数退出就会被释放。

动态内存分配/利用未使用的内存

我要写一个动态需要大量内存的应用程序。 大多数内存用于缓存目的,仅用于加速。 这些部分实际上可以按需释放。 不幸的是,如果内存耗尽,我的内核会终止进程。 但它可以简单地释放记忆。 所以我想要的是非常类似于linux页面缓存,因为它在这里解释。 是否有可能以方便的方式在用户空间中实现此类行为? 我正在考虑使用“缓存文件”来实现这样的缓存,这些缓存存储在带有内存映射文件IO的ramfs / tmpfs上,但我确信,有一种更舒适的方式。 提前致谢!

根据长度崩溃对静态数组中的字符串进行排序? |错误的分配/访问|

我想创建一个字符串数组,并根据它们的长度(最小 – >最大)按顺序对它们进行排序,但程序在所有输入后崩溃。 并且它绕过元素0(在输入期间直接从元素1开始) #include #include main() { int i,j,N; printf(“\nInput amount of alphanumericals: “); scanf(“%d”,&N); { int min; char *swap=(char*)malloc(sizeof(char)*150); char *A[N],**temp; for(i=0;i<N;i++) *(A+i)=malloc(sizeof(char)*N);//Error Here temp=A; for(i=0;i<N;i++){ printf("\nInput %d element:",i+1); fgets(temp+i,150,stdin);//And Here } printf("\n\nData ["); for(i=0;i<N;i++) printf(" %s",A[i]); printf(" ]\n\n"); //insertion sort for(i=0;i<N;i++){ min=i; for(j=i+1;j<N;j++){ if(strcmp(A[j],A[min])<0){ min=j; } } if(min!=i){ swap=A[i]; A[i]=A[min]; A[min]=swap; } […]

什么算法适用于小内存块的连续重新分配?

在C程序中我面临需要有大量内存块的事务,我需要知道是否有用于处理所有这些malloc / free的算法或最佳实践teqnique,我已经使用数组来存储这些内存块但是在某些情况下指出数组本身已满,重新分配数组只是更浪费,处理这个问题的优雅方法是什么?

为char数组分配内存以连接已知的文本和整数

我想连接一段文本,例如“答案是”带有符号整数,给出输出“数字是42”。 我知道这段文字有多长(14个字符),但我不知道该字符串表示的字符数是多少。 我假设最坏的情况,最大的有符号16位整数有5位数,如果它是负数,还有一个额外的,所以下面的代码是正确的方法吗? #include #include int main() { char *message; message = malloc(14*sizeof(char)+(sizeof(int)*5)+1); sprintf(message, “The answer is %d”, 42); puts(message); free(message); }

如何在C中初始化二维字符串数组的行

我想使用指针将字符串存储在2D数组中,但我对如何操作感到困惑。 我见过的例子只使用int数组或使用方括号[]来分配固定大小的内存。 所以我正在尝试初始化我的2D字符串数组,这就是我所拥有的: char ** stringArr = (char**)malloc(/*I don’t know what goes here*/); for(i = 0; i < rows; i++) stringArr[i] = (char*)malloc(cols *sizeof(char)); 正如你可以看到我第一次调用malloc的参数一样,如果我想要一个精确的x行数,我会被困在哪里,每行都存储一串字符。 任何帮助,将不胜感激!

将内存分配给字符串数组

我想用两个函数填充一个字符串数组:第一个,如果我有n个字符串要分配,将分配n个内存空间; 第二个将为每个读取的字符串分配内存 这是第一个function: char** allocate(int n) { char** t; t=(char**)malloc(n*sizeof(char*)); if(!t) exit(-1); return t; } 这是第二个: void fill(char*** t,int n) { int i; char* help=” “; for(i=0;i<n;i++) { printf("\n saisir la chaine n %d :",i+1); scanf("%s",help); *t[i]=(char*)malloc((strlen(help)+1)*sizeof(char)); strcpy(*t[i],help); } } 我没有忘记像这样打电话给第二个: fill(&t,n); 问题是我在读完第一个字符串并且程序结束后出错。