指针 - 作为结构指针+ Malloc投射

时间:2014-01-20 06:39:33

标签: c pointers casting malloc sizeof

我对这会做些什么有一些想法,但我想要一个更专业和经验丰富的解释。

typedef struct{
     char str[50];
     unsigned short num;
}s;

s *name = (s *) malloc(sizeof(s));

第一部分定义了一个结构。我没有问题 这将创建一个指向“s”结构的指针。 malloc()返回一个内存地址,该地址将被转换为指向“s”的指针。但是,sizeof(s)我相信我有一些问题需要理解。

char str[50]; = 50个字节 unsigned short num; = 2个字节。

sizeof(s)返回52个字节?

malloc(sizeof(s))分配52个字节并返回第一个地址并将其转换为指向“s”的指针?

还有一个问题! 如何使用malloc in-line执行错误处理?

感谢任何有助于澄清此事的人!

2 个答案:

答案 0 :(得分:2)

sizeof(s)的值是实现,ABI是特定的(至少是51 - 在sizeof(short)==1short - s的假想奇怪机器上可能是51像char一样对齐;我不能命名任何这样的机器)。但是在我的Linux / Debian / Sid / x86-64系统上(x86-64 ABI),它是52.而sizeof是在编译时计算的

  

如何使用malloc in-line执行错误处理?

通常的做法可能是

s *name = malloc(sizeof(s));
if (!name) { perror("malloc of name"); exit(EXIT_FAILURE); };

答案 1 :(得分:2)

  • 在C中,我们不需要转换malloc的返回值。 malloc返回void *并在C中,void *隐式转换为您指定的任何类型......
  • sizeof(s)返回的值取决于填充以及实现(cos,sizeof(unsigned short)在不同平台上会有所不同......)。
  • 在C中,如果要检查错误,则必须将malloc的返回值与NULL进行比较。

    if(name == NULL)exit(1); // EXIT_FAILURE