Tag: 内存管理

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

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

为什么calloc需要两个参数而malloc只需要一个?

我calloc(1, sizeof(MyStruct))编写calloc(1, sizeof(MyStruct))非常麻烦。 我不想使用包装此方法等的想法。我的意思是我想知道两个参数给了我什么? 如果它给出了一些东西,为什么malloc也没有两个参数呢? 顺便说一句,我搜索了这个问题的答案,但我没有找到一个非常好的答案。 那些答案是calloc可以分配比malloc can等更大的块。 我看到calloc分配一个数组的另一个答案。 使用malloc我可以繁殖,我会得到一个数组,我可以在开始时使用它而不用1, 。

使用realloc(X,0)代替free()并使用长度为+1的malloc +1

所以这次我真的不知道如何把这个头衔。 首先,我想说,如果问题与“家庭作业”有关,我在这个页面上看到了一些关于警告的评论。 我的是,但它也已完成,我只是想进一步了解代码发生了什么。 我已经阅读了一段时间的post和书籍,但我想我仍然缺少一些东西。 在我使用的代码中,我有两行代码,我不太明白。 这项工作是关于获取用作参数的任何文件(如果它是0个文件,它从stdin读取),并将其打印在标准输出上。 所有这些,谈论C,因为我试图放入标签。 第一个问题是: array = realloc (array, 0); 其中数组定义为 char **array; 而问题是免费不起作用,它没有释放使用的空间(也许我用错了?在其他地方我知道如何使用它,但不是这次)。 通过我已经完成的测试和我读过的内容,我相信realloc也在做同样的事情,但我不是100%。 第二个是: char* alloc = malloc (strlen ((char*)string)+1); 其中alloc用于复制我要放入数组的行的确切长度,所以我可以在此之后向后打印文本。 问题是为什么我必须使用+1。 我的意思是如果由于某种原因我不使用它不起作用,我尝试使用不同的数字,它每次都有效,但如果我不这样做+1它不能正常工作。 我知道可能这个问题太模糊,写得不好真的得到回答但又一次,我不确定,我尽力解释自己(英语没有母语,因为它可能很明显)。

为什么不将free(p)设置为NULL?

任何原因导致这不能成为free()标准行为? 多个指针指向同一个对象: #include #include void safefree(void*& p) { free(p); p = NULL; } int main() { int *p = (int *)malloc(sizeof(int)); *p = 1234; int*& p2 = p; printf(“p=%p p2=%p\n”, p, p2); safefree((void*&)p2); printf(“p=%p p2=%p\n”, p, p2); safefree((void*&)p); // safe return 0; } 来自malloc赋值要求从void* 反之亦然: safefree()要求转换为void*& (参考)

为什么在C中使用malloc时指定大小?

请使用以下代码: int *p = malloc(2 * sizeof *p); p[0] = 10; //Using the two spaces I p[1] = 20; //allocated with malloc before. p[2] = 30; //Using another space that I didn’t allocate for. printf(“%d”, *(p+1)); //Correctly prints 20 printf(“%d”, *(p+2)); //Also, correctly prints 30 //although I didn’t allocate space for it 使用malloc(2 * sizeof […]

为什么有一个特殊的new和删除数组?

使用delete而不是delete[]什么问题? 在分配和释放数组的过程中是否有一些特殊的事情发生? 为什么它与malloc和free不同?

C中指针和全局变量的位置

指针和全局变量存储在C中的哪里? 它们是保存在内存,堆还是堆栈中?

3D数组的动态内存分配

可能重复: Malloc是C中的三维数组? 2D和3Darrays的动态分配/释放 如何使用malloc分配3D数组?

C内存分配器和严格别名

即使在阅读了很多关于严格别名规则之后,我仍然感到困惑。 据我所知,不可能实现遵循这些规则的合理的内存分配器,因为malloc永远不能重用释放的内存,因为内存可以用于在每次分配时存储不同的类型。 显然这不可能是正确的。 我错过了什么? 如何实现遵循严格别名的分配器(或内存池)? 谢谢。 编辑:让我用一个愚蠢的简单例子来澄清我的问题: // s == 0 frees the pool void *my_custom_allocator(size_t s) { static void *pool = malloc(1000); static int in_use = FALSE; if( in_use || s > 1000 ) return NULL; if( s == 0 ) { in_use = FALSE; return NULL; } in_use = TRUE; return pool; } […]

线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x0)标准C内存问题

我正在编写代码来比较标准C中的两个输入文件,使用Xcode IDE。 我一直收到这个错误:线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x0)。 我已经对此做了一些阅读,并认为这是一个内存问题,但无论我尝试什么,我似乎无法修复它(我也尝试使用malloc动态制作结构并列出底部的代码)。 这很奇怪,因为它会写入所有数据,然后在最后发出错误。 文件格式是这样的:start(int).. stop(int)id(+或 – )现在有些东西我不关心其余部分我刚刚在一个文件上测试这个只有+ id,所以“ – ”方面不是问题的一部分。 无论如何我已经累了,已经盯着这几个小时了,所以请原谅我,如果它没有意义,我会在几个小时的睡眠后更新它。 typedef struct { int start; int stop; char *strandID; } location; int main(int argc, const char * argv[]) { if (argc != 4) { fprintf(stderr, “Usage is ./a.out windowfile.txt genefile.txt outputFileName”); exit(-1); } //const vars const char *windowInput = argv[1]; […]