【问题标题】:Generic function for malloc to accept all data typemalloc 接受所有数据类型的通用函数
【发布时间】:2016-05-31 04:38:40
【问题描述】:

给定一个函数as(它可以在内部使用malloc())as void* function_ptr(void *ptr, int size);

其中void *ptr 是一个空指针,size 是数字,作为回报,它应该根据数据类型分配内存。对于int,它应该分配4*size(considering 32 bit),对于char1*size。 例如,

对于整数数据类型,function_ptr((void *)some_int_ptr, 10 )
它应该分配10 *4(32 bit) = 40 bytes
function_ptr((void *)some_char_ptr, 10 ),应该分配10个字节

问题是我们如何将void * 类型转换为int/char/double 指针作为函数不知道哪个数据类型被类型转换为void*

这是一个面试问题,我尝试回答为再发送 1 个提到数据类型的参数,因此我们可以分配和分配内存,但没有被接受为

void* function_ptr(void *ptr, int size, int data_type);

【问题讨论】:

  • #define allocate(pret, len) malloc((len) * sizeof *(pret))?如果你把它转换成void*,唯一的(而且是不可移植的,有时是错误的)就是假设sizeof(*ptr) == _Alignof(*ptr)
  • 你的面试问题是什么?
  • @ashish 这个问题真的没有意义。它说的是“数据类型”,但根本不清楚应该是什么类型。我会用“数据类型什么?”来回答这个问题
  • 上述问题的意义为零。要么你记错了,要么面试官做得不够好,委婉地说。
  • 可能是个技巧问题?这似乎是唯一合乎逻辑的答案,一旦将指针传递给该函数,它就会被强制转换(如果不是手动强制转换)为 void *。从函数内部无法检测到它最初指向的数据类型。

标签: c


【解决方案1】:

您无法从函数内部知道数据类型,因为没有可用的类型信息。有两种选择:

1) 要么让函数以bytes 为单位工作,那么它就不需要知道类型。也许这就是面试官的意思?

2) 重写函数,使其在某处包含类型信息。

还有一些不好的选择,例如使用全局变量或用包装宏替换函数,但都不推荐。

【讨论】:

  • 我写了这样的函数,但它不起作用(我有几年的 C 休息,也许是愚蠢的错误。你能看看吗?)onlinegdb.com/-gkRS5lSP
  • @Marcin_cyna 请使用“提问”按钮将其作为正确的问题提问,并将代码的相关部分发布在本网站上。
猜你喜欢
  • 2015-03-21
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 2021-06-11
相关资源
最近更新 更多