2014-01-20 134 views
0

我对这将做什么有一些想法,但我想要更专业和有经验的解释。指针 - 铸造结构指针+ Malloc

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进行错误处理?

感谢任何人可以帮助澄清这一点!

+4

[不要强制返回'malloc'](http://stackoverflow.com/a/605858/440558)。 –

+1

此外,'sizeof'可能会根据结构填充返回不同的数字。 –

+1

检查malloc的返回地址,如果它为NULL或不是用于错误处理 – user2760375

回答

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

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

2

sizeof(s)值是实现和ABI具体(它至少是51 - 它可能是51假设的怪异的机器,其中sizeof(short)==1short -s对准像char是,我不能说出任何这样的机器) 。但是在我的Linux/Debian/Sid/x86-64系统上(使用x86-64 ABI)它是52.并且sizeof编译时间被计算。

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

通常的做法可能是

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