Tag: 内存管理

realloc和memcpy如何工作?

我有两个问题。 realloc()和memcpy()以比迭代每个元素O(N)更快的方式将数组中的条目复制到另一个中? 如果答案是肯定的,那么您认为它的复杂性是什么? 如果分配的大小小于原始大小, realloc()是否realloc()条目复制到其他位置,或者只是保留它们,因为它们会减小数组的大小?

内核将内存归零?

我正在使用Debian挤压并注意到内存始终为零。 这是Linux发行版中的新function吗? 前段时间,我相信我可以使用puts()并输出垃圾。 我多次运行这个测试程序,但评论结果总是一样的。 (我在sysctl.conf中有randomize_va_space = 2所以我知道每次运行时都会使用不同位置的内存。) char *a = malloc(50000000); a[49999999] = ‘\0’; puts(a); // it outputs nothing since all are zeroes printf(“%p\n”, a); if(a[5000] == ‘\0’) // this condition is always true { puts(“It is a nul char.”); } 是否有可能使系统内存不为零? 这个Debian挤压安装有哪些选项可以激活始终为零内存?

如何在内存中存储任意大的整数值?

我必须存储一个大于long数据类型的最大值的整数值。 我如何在内存中存储和操作此值? 如果可能的话,请通过一个例子来说明。

当变量超出范围时会发生什么?

在大多数托管语言(即具有GC的语言)中,超出范围的局部变量不可访问且具有更高的GC优先级(因此,它们将首先被释放)。 现在,C不是托管语言,超出范围的变量会发生什么? 我在C中创建了一个小测试用例: #include int main(void){ int *ptr; { // New scope int tmp = 17; ptr = &tmp; // Just to see if the memory is cleared } //printf(“tmp = %d”, tmp); // Compile-time error (as expected) printf(“ptr = %d\n”, *ptr); return 0; } 我正在使用GCC 4.7.3进行编译,上面的程序打印17 ,为什么? 何时/在什么情况下可以释放局部变量?

从K&R书中解释malloc的这种实现

这是Kernighan和Ritchie关于C的书的摘录。 它显示了如何实现malloc一个版本。 虽然评论很好,但我很难理解它。 有人可以解释一下吗? typedef long Align; /* for alignment to long boundary */ union header { /* block header */ struct { union header *ptr; /* next block if on free list */ unsigned size; /* size of this block */ } s; Align x; /* force alignment of blocks */ }; typedef union […]

查找数据段的地址范围

作为编程练习,我在C中编写了一个标记 – 清除垃圾收集器。我希望扫描数据段(全局等)以获得指定内存的指针,但我不知道如何获取该段的地址。 我怎么能这样做?

在C中退出程序时释放所需的内存

如果我使用malloc在我的C程序中分配内存,现在我想退出,我是否必须释放分配的内存,或者我可以假设,因为我的整个程序终止,它将被操作系统释放? 我在Linux环境中运行。

程序终止后动态分配内存

当包含动态分配的内存(使用malloc / new)而没有空闲/删除调用的C / C ++程序终止时,动态分配的内存会发生什么? 操作系统是否收回内存或者其他程序无法访问该内存?

gcc结构中的内存对齐

我将应用程序移植到C中的ARM平台,该应用程序也在x86处理器上运行,并且必须向后兼容。 我现在有一些变量对齐的问题。 我已经阅读了__attribute__((aligned(4),packed))的gcc手册__attribute__((aligned(4),packed))我解释了所说的内容,因为struct的开头与4字节边界对齐,并且由于packed语句,内部保持不变。 最初我有这个,但偶尔它与4字节边界不对齐。 typedef struct { unsigned int code; unsigned int length; unsigned int seq; unsigned int request; unsigned char nonce[16]; unsigned short crc; } __attribute__((packed)) CHALLENGE; 所以我把它改成了这个。 typedef struct { unsigned int code; unsigned int length; unsigned int seq; unsigned int request; unsigned char nonce[16]; unsigned short crc; } __attribute__((aligned(4),packed)) CHALLENGE; 我之前说过的理解似乎是不正确的,因为结构现在都与4字节边界对齐,并且内部数据现在与4字节边界对齐,但由于字节顺序,结构的大小增加了大小从42到44个字节。 这个大小是至关重要的,因为我们有其他依赖于结构为42字节的应用程序。 […]

malloc实现?

我正在尝试为C实现malloc和free ,我不知道如何重用内存。 我目前有一个如下所示的struct : typedef struct _mem_dictionary { void *addr; size_t size; int freed; } mem_dictionary; 我的malloc看起来像这样: void *malloc(size_t size) { void *return_ptr = sbrk(size); if (dictionary == NULL) dictionary = sbrk(1024 * sizeof(mem_dictionary)); dictionary[dictionary_ct].addr = return_ptr; dictionary[dictionary_ct].size = size; dictionary[dictionary_ct].freed = 1; dictionary_ct++; return return_ptr; } 当我释放内存时,我只会将地址标记为0 (这表示它是免费的)。 在我的malloc ,我会使用for循环来查找数组中的任何值等于0 ,然后将内存分配给该地址。 我有点困惑如何实现这一点。