【问题标题】:Recover value set by memset恢复 memset 设置的值
【发布时间】:2014-09-26 02:09:15
【问题描述】:

如何恢复 memset 的值?

在下面的代码中,程序应该分配一定数量的用户请求的空间,并在返回给用户的指针之前存储用户请求的大小:

void* my_malloc(size_t sz)
    void* block = malloc(sz + sizeof(size_t));
    void* retval = &block + sizeof(size_t);
    memset(block, sz, sizeof(size_t));
return retval;

在另一个函数中,用户可以传入他们数据的指针,我想恢复我存储在他们内存之前的大小。

void my_free(void *ptr) {

    void* block = ptr - sizeof(size_t);
    size_t *sz;
    memset(sz, block, sizeof(size_t));//This is the line in question.

free(block);

有什么 memread 函数可以用来重置 sz 的值吗?这个当前的方法给了我错误

【问题讨论】:

  • 我认为您对memset() 的调用不会像您认为的那样。根据您的描述,您根本不想使用memset()
  • 除了错误地使用memset之外,你在my_malloc中对retval的计算也完全是假的。

标签: c memset


【解决方案1】:

您确实需要阅读memset 的文档。它将一块内存设置为所有字节都相同memset(block, sz, sizeof(size_t)) 的作用是将block 的第一个8(或size_t 的大小)字节全部设置为(unsigned char)sz

要复制一些字节,正确的函数是memcpy,所以该行应该是:

memcpy(block, &sz, sizeof sz);

在你想要的free函数中:

size_t sz;
memcpy(&sz, block, sizeof sz);

另外,你在两个地方做了不正确的指针运算:

void *retval = &block + sizeof(size_t);    // moves sizeof(size_t) * sizeof(void *) bytes
void *block = ptr - sizeof(size_t);        // illegal

指针运算的定义是移动所指向的类型的元素个数。您似乎假设它是字节数。你真正想要的分别是:

void *retval = (char *)block + sizeof(size_t);
void *block = (char *)ptr - sizeof(size_t);

强制转换是因为没有为void * 定义指针算法。由于sizeof(char) == 1,然后在char * 上进行指针算术运算会使您移动该字节数。

如果你正确理解了指针算法,那么你会意识到编写这些语句的另一种方法是:

void *retval = (size_t *)block + 1;
void *block = (size_t *)ptr - 1;

最后,对于比size_t 具有更高对齐要求的任何类型,您的 malloc 替换都将失败(尽管您的系统可能没有任何此类类型)。

【讨论】:

    猜你喜欢
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 2022-09-29
    • 1970-01-01
    相关资源
    最近更新 更多