我刚刚完成了一项测试,作为求职面试的一部分,一个问题让我感到难过 - 甚至使用谷歌作为参考.我想看看stackoverflow工作人员可以用它做什么:
"memset_16aligned"函数需要传递给它的16byte对齐指针,否则它将崩溃.
a)如何分配1024字节的内存,并将其与16字节边界对齐?
b)执行memset_16aligned后释放内存.
{
void *mem;
void *ptr;
// answer a) here
memset_16aligned(ptr, 0, 1024);
// answer b) here
}
Run Code Online (Sandbox Code Playgroud) 我最初的问题是,在一个项目中,我有几个共享一生的对象(即,一旦我释放其中一个,我将释放它们全部),然后我想分配一个单独的内存块.我有三个不同的对象类型的数组,struct foo,void *,和char.起初我想要malloc()一个像这样的块:
// +---------------+---------+-----------+---------+---------+
// | struct foo[n] | padding | void *[m] | padding | char[o] |
// +---------------+---------+-----------+---------+---------+
Run Code Online (Sandbox Code Playgroud)
但那么......如果不调用未定义的行为,我怎么能做到这一点呢?即,尊重类型别名规则,aligment ...如何正确计算内存块大小,声明内存块(具有有效类型),以及如何正确地获取指向其中所有三个部分的指针?
(我明白我可以使用malloc()3个块,这会导致3个块,free()但我想知道如何使用单个块来执行它,同时仍然表现良好.)
我想将我的问题扩展到一个更普遍的问题:应该采取什么预防措施来为任意大小和对齐的对象实现内存池,同时保持程序的良好运行?(假设可以在不调用未定义行为的情况下实现它.)
我正在尝试实现malloc和freeC,我不知道如何重用内存.我目前struct看起来像这样:
typedef struct _mem_dictionary {
void *addr;
size_t size;
int freed;
} mem_dictionary;
Run Code Online (Sandbox Code Playgroud)
我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;
}
Run Code Online (Sandbox Code Playgroud)
当我释放内存时,我只会将地址标记为0(表示它是免费的).在我看来malloc,我会使用for循环来查找数组中的任何值0,然后将内存分配给该地址.我有点困惑如何实现这一点.
这是C11标准的引用:
6.5表达式
......6 访问其存储值的对象的有效类型是对象的声明类型(如果有).如果通过具有非字符类型的左值的值将值存储到没有声明类型的对象中,则左值的类型将成为该访问的对象的有效类型以及不修改该值的后续访问的有效类型储值.如果使用
memcpy或将值复制到没有声明类型的对象中memmove,或者将其复制为字符类型数组,则该访问的修改对象的有效类型以及不修改该值的后续访问的有效类型是有效类型复制值的对象,如果有的话.对于没有声明类型的对象的所有其他访问,对象的有效类型只是用于访问的左值的类型.7对象的存储值只能由具有以下类型之一的左值表达式访问:
- 与对象的有效类型兼容的类型,
- 与对象的有效类型兼容的类型的限定版本,- 与对象
的有效类型对应的有符号或无符号类型的类型,
- 类型这是对象的有效类型的限定版本对应的有符号或无符号类型,
- 聚合或联合类型,包括其成员中的上述类型之一(包括递归地,子聚合或包含联合的成员) ,或
- 字符类型.
这是否意味着memcpy不能以这种方式用于打字:
double d = 1234.5678;
uint64_t bits;
memcpy(&bits, &d, sizeof bits);
printf("the representation of %g is %08"PRIX64"\n", d, bits);
Run Code Online (Sandbox Code Playgroud)
为什么它不会给出相同的输出:
union { double d; uint64_t i; } u;
u.d = 1234.5678;
printf("the representation of %g is %08"PRIX64"\n", d, u.i);
Run Code Online (Sandbox Code Playgroud)
如果我使用我的memcpy使用字符类型的版本怎么办:
void *my_memcpy(void *dst, const void *src, size_t n) {
unsigned char …Run Code Online (Sandbox Code Playgroud) 该malloc()函数返回一个类型的指针void*.它根据size_t作为参数传递给它的值以字节为单位分配内存.生成的分配是原始字节,可以与C中的任何数据类型一起使用(无需转换).
可以char在返回的函数内声明类型的数组void *,可以与任何数据类型一起使用,例如生成的分配malloc?
例如,
#include <stdio.h>
void *Stat_Mem();
int main(void)
{
//size : 10 * sizeof(int)
int buf[] = { 1,2,3,4,5,6,7,8,9,10 };
int *p = Stat_Mem();
memcpy(p, buf, sizeof(buf));
for (int n = 0; n < 10; n++) {
printf("%d ", p[n]);
}
putchar('\n');
return 0;
}
void *Stat_Mem()
{
static char Array[128];
return Array;
}
Run Code Online (Sandbox Code Playgroud)