使用sizeof(类型[1234])有什么问题吗?

3 c sizeof

我已经使用它多年了,即:

text = (char *)malloc( sizeof(char[1234]) );
Run Code Online (Sandbox Code Playgroud)

代替:

text = (char *)malloc( sizeof(char) * 1234 );
Run Code Online (Sandbox Code Playgroud)

人们告诉我这很危险,但没有人能说出原因.我检查了C规格,这是合法的.这里有陷阱吗?

bdo*_*lan 7

这可能是合法的,但有一些陷阱.

首先,如果您(或后来的维护者)盲目地用表达式替换类型,那么您将遇到问题:

sizeof(char *) * 4 => sizeof(x) * 4  // OK
sizeof(char *[4])  => sizeof(x[4])   // NOT OK
Run Code Online (Sandbox Code Playgroud)

其次,并非所有编译器都支持可变长度数组:

sizeof(char *) * n  // ALWAYS SUPPORTED
sizeof(char *[n])   // MAY NOT BE SUPPORTED
Run Code Online (Sandbox Code Playgroud)

最后,它不是一个非常常见的习语,所以阅读代码的人可能会暂时混淆.

这些陷阱是否值得努力改变你的习惯取决于你,当然:)