Tag: malloc

是否有可能在C中编写一致的malloc实现?

这是一个char数组可以与任何数据类型一起使用的后续内容吗? 我知道动态内存和malloc的常见实现,可以在维基百科上找到引用。 我也知道malloc返回的指针可以转换成程序员想要的任何东西,甚至没有警告,因为6.3.2.3指针中的标准状态§1 指向void的指针可以转换为指向任何不完整或对象类型的指针。 指向任何不完整或对象类型的指针可能会转换为指向void的指针并再次返回; 结果应该等于原始指针。 问题是假设我有一个没有malloc和free的独立环境,我如何在符合C的情况下构建这两个函数的实现? 如果我对标准采取一些自由,很容易: 从一个大字符数组开始 使用相当大的对齐(对于许多架构,8应该足够) 实现一个算法,从该数组返回地址,在该对齐,跟踪已分配的内容 – 在malloc实现中可以找到很好的例子? 问题是该实现返回的指针的有效类型仍然是char * 标准在同一段§7中说明 指向对象或不完整类型的指针可以转换为指向不同对象或不完整类型的指针。 如果结果指针未针对指向类型正确对齐,则行为未定义。 否则,当再次转换回来时,结果应该等于原始指针。 这似乎并不允许我假装被声明为简单字符的内容可以神奇地包含另一种类型,甚至是该数组的不同部分中的不同类型或同一部分中的不同时刻。 不同地解释引用这样的指针似乎是未定义的行为,并严格解释标准。 这就是为什么当你在字符串缓冲区中获得对象的字节表示时,常见的习语使用memcpy而不是别名,例如当你从网络流中读取它时。 那么如何在纯C中构建一个符合malloc的实现呢?

在C ++中对齐malloc

我对书中的问题13.9提出了一个问题,即“破解编码面试”。 问题是编写一个支持分配内存的对齐alloc和free函数,在答案中代码如下: void *aligned_malloc(size_t required_bytes, size_t alignment) { void *p1; void **p2; int offset=alignment-1+sizeof(void*); if((p1=(void*)malloc(required_bytes+offset))==NULL) return NULL; p2=(void**)(((size_t)(p1)+offset)&~(alignment-1)); //line 5 p2[-1]=p1; //line 6 return p2; } 我对第5行和第6行很困惑。为什么你必须做一个“和”,因为你已经为p1添加了偏移? [-1]是什么意思? 我在这里先向您的帮助表示感谢。

在gdb会话中调用malloc失败

我正在尝试调试一个C程序,gdb告诉我在某个函数的第329行有一个段错误。 所以我为该function设置了一个断点,我试图逐步完成它。 但是,每当我点击第68行时,我都会从gdb收到此投诉: (gdb) step 68 next_bb = (basic_block *)malloc(sizeof(basic_block)); (gdb) step *__GI___libc_malloc (bytes=40) at malloc.c:3621 3621 malloc.c: No such file or directory. in malloc.c 我不知道这意味着什么。 该程序在除一组输入之外的所有输入上运行完美,因此在执行该程序的其他执行期间,对malloc的调用显然成功。 当然,我有: #include . 这是源代码: // Block currently being built. basic_block *next_bb = NULL; // Traverse the list of instructions in the procedure. while (curr_instr != NULL) { simple_op […]

从控制台读取未知长度的字符串

如果我想从命令行读取任意长度的字符串,那么最好的方法是什么? 目前我正在这样做: char name_buffer [ 80 ]; int chars_read = 0; while ( ( chars_read < 80 ) && ( !feof( stdin ) ) ) { name_buffer [ chars_read ] = fgetc ( stdin ); chars_read++; } 但是如果字符串超过80个字符,我该怎么办? 显然我可以将数组初始化为更大的数字,但我确定必须有更好的方法使用malloc或其他东西为数组提供更多空间? 任何提示都会很棒。

为什么在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 […]

当realloc移动内存块时如何更新其他指针?

realloc引用说: 该function可以将存储块移动到新位置,在这种情况下返回新位置。 这是否意味着如果我这样做: void foo() { void* ptr = malloc( 1024 ); unsigned char* cptr = ( unsigned char* )ptr+256; ptr = realloc( ptr, 4096 ); } 如果realloc移动块,cptr可能会变为无效? 如果是,那么以任何方式重新分配信号,它将移动块,以便我可以做一些事情来防止cptr变得无效?

C编程:用于2D数组的malloc()(使用指针到指针)

昨天我发布了一个问题: 我应该如何传递指向函数的指针并为被调用函数内部传递的指针分配内存? 从我得到的答案中,我能够理解我在做什么错误。 我现在面临一个新问题,任何人都可以帮忙解决这个问题吗? 我想动态分配一个2D数组,所以我将指针从我的main()传递给另一个名为alloc_2D_pixels(…)函数,其中我使用malloc(…)和for(…)循环为2D数组分配内存。 好吧,从alloc_2D_pixels(…)函数返回后,指针指针仍然保持为NULL,所以很自然地,当我尝试访问或尝试free(…)指针到指针时,程序挂起。 谁能告诉我我在这里犯的错误? 救命!!! 维克拉姆 资源: main() { unsigned char **ptr; unsigned int rows, cols; if(alloc_2D_pixels(&ptr, rows, cols)==ERROR) // Satisfies this condition printf(“Memory for the 2D array not allocated”); // NO ERROR is returned if(ptr == NULL) // ptr is NULL so no memory was allocated printf(“Yes its NULL!”); // Because […]

realloc():重新分配时为下一个大小无效,为char *上的strcat腾出空间

我在以下代码上收到无效的内存错误: printf(” %s\n”,”FINE 5″); printf(“%s LENGTH IS: %d\n”,”FINE 6″,strlen(“: “)); buffer = (char *)realloc(buffer, strlen(buffer)* sizeof(char) + (strlen(“: “)+1)* sizeof(char)); printf(” %s\n”,”FINE 7″); strcat(buffer, “: \0”); 输出: 精细5 精细6长度是:2 *检测到glibc * ./auto:realloc():下一个大小无效:0x08cd72e0 *** ======= Backtrace:========= /lib/tls/i686/cmov/libc.so 0.6(+ 0x6b591)[0x6dd591] 这里需要注意的是Fine 7从未打印过。 每次运行时无效的下一个大小错误位于同一位置。 发现这种相关性

3D数组的动态内存分配

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

类型化malloc C ++

我有一些带有malloc语句的C代码,我想与一些C ++代码合并。 我想知道什么时候以及为什么要在C ++中调用malloc neccessary? 例如: char *str = (char*)malloc(strlen(argv[1]) * sizeof(char));