Tag: 内存管理

应该什么时候C函数返回新分配的内存?

在其他地方的回复中,我找到了以下代码段: 一般来说,让C调用者分配内存而不是被调用者更好 – 因此在我看来strcpy是一个“更好”的函数,而不是strdup。 我可以看到这是一个有效的模式,但为什么它会被认为更好? 遵循这种模式是否有优势? 或不? 例 最近我写了大量的代码看起来像: struct foo *a = foo_create(); // do something with a foo_destroy(a); 如果foo不仅仅是一个扁平结构,那么我想我可以将所有初始化完成一步。 另外,假设结构应该在堆上。 为什么这样做会更好: struct foo *a = malloc(sizeof(foo)); foo_init(a); // do something with a foo_destroy(a)

在什么情况下malloc可以返回NULL?

它从来没有发生在我身上,而且我已经编程多年了。 有人能给我一个非平凡程序的例子,其中malloc实际上不起作用吗? 我不是在谈论内存耗尽 :我正在寻找一个简单的例子,当你只分配一个由用户给出的绑定大小的内存块时,假设一个整数,导致malloc失败。

2次幂数据的性能优势?

如果我有一个拥有3D世界的游戏,并且世界相当大,那么需要分成几个块,是否有一个主要的,如果有的话,有128个字节块的性能优势,比如150个字节的块? 显然,块中的对象仍然是整数个字节。 即chunks[128][128][128]比chunks[150][150][150]或chunks[112][112][112]更快? 之后是否存在其他副作用,例如过多的RAM浪费? 是否还有其他因素需要考虑? 我只是看到将所有内容存储在变量和大小为2的幂的数组中是一种惯例,但我不确定它是否有任何优点,如果使用更多人类数字如100或150更好。

我是否正确创建并将此C数组传递给Objective-C方法并使用属性引用它?

我创建了一个像这样的C数组: unsigned char colorComps[] = {2, 3, 22, 55, 9, 1}; 我想传递给Objective-C对象的初始化器。 所以我想我必须将数组放在堆上: size_t arrayByteSize = numColorCompVals * sizeof(unsigned char); unsigned char *colorCompsHeap = (unsigned char*)malloc(arrayByteSize); 然后我必须在for循环中将我的第一个“堆栈内存数组”写入堆数组: for (int i = 0; i < numColorCompVals; i++) { colorCompsHeap[i] = colorComps[i]; } 附带问题:是否有更优雅的解决方案来避免循环步骤? 然后我将它传递给方法: 定义为 – (id)initWithColorCompsC:(unsigned char *)colorCompsHeap; TheObject *obj = [[TheObject alloc] initWithColorCompsC:colorCompsHeap]; TheObject具有保存C数组的属性: […]

调用fopen时的内存分配不明确

1. File *fp; 2. fp = fopen (“/etc/myfile.txt”, “w”); 3. fclose(fp); 现在 我看了这个 : 在语句1中,在堆栈上创建了类型为“FILE”的指针的4字节内存。 在语句2中,在堆上分配memory =’sizeof(FILE)’,并将其地址分配给指针’fp’。 有人可以在声明2上解释更多。我们是否为所有文件分配相同的堆大小? 操作系统如何知道它应该分配的FILE的大小? 在低水平,在第2阶段到底发生了什么。

strcpy()/ uninitialized char指针这个代码背后的诀窍是什么?

#include #include #include void main () { char *imsi; unsigned int i; int val; char *dest; imsi = “405750111”; strncpy(dest,imsi,5); printf(“%s”,dest); /* i = 10; */ } 在上面的代码中,如上所述对i = 10赋值进行了注释,代码工作正常,没有错误。 当包含赋值用于编译时,错误(分段错误)发生在strncpy(dest,imsi,5); 。 通过避免对变量i的优化(即, volatile int i; ),即使包括赋值( i = 10 ),也清除错误。

重新初始化arrays是否会产生段错误?

我正在对输入文件格式(u,v,weight)的大量图形数据运行宽度优先搜索和贝尔曼福特算法。 我在广度优先搜索中初始化,所有顶点都应标记为0以供未访问。 后来在程序中,因为我每次添加边缘后都会调用BFS,而不是在程序结束时(这是关于Bellman ford和BFS的研究项目的一部分,即使它没有多大意义)我将顶点数组重新初始化为unvisited。 但是,当我重新初始化顶点数组时运行更大的集合时,我遇到了分段错误。 我假设有更大的集合,因为我有一些较小的测试数据集,从8个顶点到10,然后在100和更大,它失败了。 以下是我在程序开始时初始化的方法: for(i=0;i<numberVertices;i++) { vertexArray[i].v = i+1; vertexArray[i].adj = NULL; vertexArray[i].marked = 0; if(i==0) { vertexArray[i].weight = 0; } else{ vertexArray[i].weight = 10000; } } 以下是我在BFS结束后直接到达文件末尾时,在while循环结束时重新初始化的方式: BFS(q, u) for(i=0;i<numberVertices;i++) { vertexArray[i].marked = 0; } 就像我说它似乎适用于较小的数据集,但我不明白为什么当我重新初始化它似乎是错误的。 请让我知道你的想法和建议! Valgrind输出示例案例: ==6634== Memcheck, a memory error detector ==6634== Copyright (C) 2002-2010, and GNU GPL’d, […]

数组本身的名称,存储在哪里

数组的名称如何存储在内存中? 例如,如果我写: char arr[10]; 数组项存储在内存中,从虚拟地址&arr[0] ,实际上是arr的值, 但是arr本身存储在哪里? 静态多维数组的行也是如此: char arr[10][20]; arr本身也是arr [0],arr [1] …. arr [9]都没有地址本身。 那么名称存储在哪里?

写出比malloced更多的字符。 为什么不失败?

为什么以下工作并没有抛出某种分段错误? char *path = “/usr/bin/”; char *random = “012”; // path + random + \0 // so its malloc(13), but I get 16 bytes due to memory alignment (im on 32bit) newPath = (char *) malloc(strlen(path) + strlen(random) + 1); strcat(newPath, path); strcat(newPath, “random”); // newPath is now: “/usr/bin/012\0” which makes 13 characters. 但是,如果我添加 strcat(newPath, […]

从C中的文件读取长行时处理内存

首先,我知道这个问题与这个主题非常接近,但问题是措辞太差,以至于我甚至不确定它是否重复加上没有显示代码所以我认为它应该被正确地问。 我试图逐行读取文件,我需要在variable中特别存储一行。 我已经设法使用fgets很容易地完成了这个操作,但是要读取的行的大小和文件中的行数 仍然未知 。 我需要一种方法来正确地为variable分配内存,无论行的大小如何, 使用C而不是C ++ 。 到目前为止我的代码看起来像这样: allowedMemory = malloc(sizeof(char[1501])); // Checks if enough memory if (NULL == allowedMemory) { fprintf(stderr, “Not enough memory. \n”); exit(1); } else char* res; res = allowedMemory; while(fgets(res, 1500, file)) // Iterate until end of file { if (res == theLineIWant) // Using strcmp instead of […]