Tag: realloc

realloc无效的旧大小

免责声明:这是作业。 我正在尝试它,不要指望或希望任何人为我做这件事。 只是几个指针(呵呵),我出错了将不胜感激。 作业要求我创建一个包含10个元素的int*数组,然后尝试在其中插入一百万个int。 每个插入检查是否需要调整数组的大小,如果需要,我会增加它的大小,以便它可以容纳一个元素。 当我插入10,000个元素时,它工作正常,但如果我尝试100,000个元素,我会收到以下错误: *** glibc detected *** ./set2: realloc(): invalid old size: 0x00000000024dc010 *** 这是我正在运行的代码。 我评论过它,所以它很容易阅读。 void main() { //begin with a size of 10 int currentsize = 10; int* arr = malloc(currentsize * sizeof(int)); int i; //initalize with all elements set to INT_MAX for(i = 0; i < currentsize; i++) { […]

如果新的尺寸更小,可以realloc移动指针吗?

我想知道当使用较小(非零)大小调用realloc时,C或C ++标准是否保证指针不会更改: size_t n=1000; T*ptr=(T*)malloc(n*sizeof(T)); //<–do something useful (that won't touch/reallocate ptr of course) size_t n2=100;//or any value in [1,n-1] T*ptr2=(T*)realloc(ptr,n2*sizeof(T)); //<– are we guaranteed that ptr2==ptr ? 基本上,OS可以自行决定,因为我们释放了大量内存块,他想利用所有realloc来对内存进行碎片整理,并以某种方式移动ptr2?

二维动态数组(c中的realloc)

我试图从输入加载两个双数字动态地由每个用户输入重新定位的二维数组。 #include #include int main(int argc, char** argv) { int count; double number1, number2, **numbers; while (scanf(“%lf,%lf”, number1, number2) != EOF) { count++; numbers = (double**) realloc(numbers, count * 2 * sizeof (double)); if (numbers == NULL) { exit(1); } numbers[count][0] = number1; numbers[count][1] = number2; } return 0; } 每次我尝试将值保存到数组(可能是内存问题)时程序失败。 它编译没有问题。 任何人都可以告诉我如何正确地重新分配新arrays? 谢谢你的帮助。

对齐内存管理?

关于管理对齐的内存块,我有一些相关的问题。 跨平台的答案是理想的。 但是,由于我非常确定不存在跨平台解决方案,因此我主要对Windows和Linux以及(在很大程度上)Mac OS和FreeBSD感兴趣。 在16字节边界上对齐大块内存的最佳方法是什么? (我知道使用malloc()的简单方法,分配一些额外的空间,然后将指针碰到一个正确对齐的值。虽然我希望能找到一些不那么重要的东西。另外,请参阅以下是其他问题。) 如果我使用普通的旧malloc() ,分配额外的空间,然后将指针移动到正确对齐的位置,是否有必要将指针保持在块的开头以便释放? (在指向块中间的指针上调用free()似乎在Windows上实际运行,但我想知道标准是什么,即使标准说你不能,它是否在所有主要的实践中都有效操作系统。我不关心模糊的DS9K操作系统。) 这是一个艰难/有趣的部分 。 在保持对齐的同时重新分配内存块的最佳方法是什么? 理想情况下,这比调用malloc() ,复制,然后在旧块上调用free()更聪明。 我想尽可能在​​适当的地方做。

C中的动态数组 – 我对malloc和realloc的理解是否正确?

我正在学习如何在C中创建动态1D数组。下面的代码尝试执行以下操作: 使用malloc ,创建一个长度为10的动态数组,它包含double类型的值。 对于j = 0, 1,…, 9 ,将数组的每个条目设置为j/100 。 然后打印出来。 使用realloc在数组末尾添加一个额外的空条目。 将新条目设置为j/100并再次打印出每个条目。 测试: double* data = (double*)malloc(10*sizeof(double)); for (j=0;j<10;j++) { data[j]= ((double)j)/100; printf("%g, ",data[j]); } printf("\n"); data = (double*)realloc(data,11*sizeof(double)); for (j=0;j<11;j++) { if (j == 10){ data[j]= ((double)j)/100; } printf("%g, ",data[j]); } free((void*) data); 问题 我编码正确吗? 教程我发现使用malloc而不将(double*)放在前面。 例如, int *指针; pointer = malloc(2 * […]

如何在C中读取无限字符

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

realloc()悬空指针和未定义的行为

当你释放内存时,指向内存的指针会发生什么? 他们立即变得无效吗? 如果他们以后再次有效会怎么样? 当然,指针变为无效然后再次变为“有效”的通常情况是将某些其他对象分配到之前使用的内存,如果使用指针访问内存,那显然是未定义的行为。 悬空指针内存覆盖了第1课,差不多。 但是,如果内存再次对同一分配有效,该怎么办? 只有一种标准方式可以实现: realloc() 。 如果你有一个指向malloc() ‘内存块中偏移量> 1某个位置的指针,那么使用realloc()将块缩小到小于你的偏移量,显然你的指针变得无效。 如果你再使用realloc()再次将块增长回至至少覆盖悬空指针指向的对象类型,并且在任何情况下都没有realloc()移动内存块,悬空指针是否再次有效? 这是一个极端的案例,我真的不知道如何解释C或C ++标准来解决它。 以下是显示它的程序。 #include #include #include int main(void) { static const char s_message[] = “hello there”; static const char s_kitty[] = “kitty”; char *string = malloc(sizeof(s_message)); if (!string) { fprintf(stderr, “malloc failed\n”); return 1; } memcpy(string, s_message, sizeof(s_message)); printf(“%p %s\n”, string, string); […]

在C中使用Realloc

就realloc的使用而言,它确实是一个建议,更具体地说,如果我可以利用它来简化我现有的代码。 基本上,下面的内容,它动态分配一些内存,如果我超过256,那么数组需要增加大小,所以我malloc一个临时数组,大小2倍,memcpy等(见下文)。 我只是想知道是否可以在下面的代码中使用realloc,简化它,任何建议,示例代码,甚至是如何实现它的提示非常感谢! 干杯。 void reverse(char *s) { char p; switch(toupper(s[0])) { case ‘A’: case ‘E’: case ‘I’: case ‘O’: case ‘U’: p = s[strlen(s)-1]; while( p >= s ) putchar( p– ); putchar( ‘\n’ ); break; default: printf(“%s”, s); break; } printf(“\n”); } int main(void) { char c; int buffer_size = 256; char *buffer, […]

最初mallocate 0元素以便以后重新分配和测量大小

我有一个函数,通过每次调用时重新分配新内存,为数组添加一个新位置。 问题在于,对于每次调用,我需要在第一次调用时从1开始向数组添加一个位置,但我知道在重新分配之前我必须进行mallocate。 所以我的问题是,我最初可以执行类似p = malloc(0) ,然后在我的函数中使用p = (int *)realloc(p,sizeof(int))重新分配吗? p声明为int *p 。 也许使用不同的语法? 当然,我可以在我的函数中创建一个条件,如果之前没有分配内存并且重新分配(如果有),则会动画定位,但我正在寻找更好的方法。 我遇到的第二个问题是……一旦重新分配更多位置,我想知道数组的大小。 我知道,例如,如果我声明一个数组a[10] ,元素的数量将由sizeof(a)/sizeof(a[0]) ,但由于某种原因,这对于声明的数组不起作用作为指针,然后重新分配。 任何建议?

使用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它不能正常工作。 我知道可能这个问题太模糊,写得不好真的得到回答但又一次,我不确定,我尽力解释自己(英语没有母语,因为它可能很明显)。