2017-01-31 15 views
0

的I型已经看到在网络上下面的语法使用malloc为malloc的正确的语法不指定变量

double ***x; 
x = malloc(N * sizeof(*x)); 
for (i = 0; i < size_y; i++) { 
    x[i] = malloc(N * sizeof(**x)); 

即,其被指出变量的类型,没有指定到malloc:通常,我们声明指针这样的:

double ***x; 
x = malloc(N * sizeof(double*)); 
for (i = 0; i < size_y; i++) { 
    x[i] = malloc(N * sizeof(double**)); 

据我了解,第一种方法允许quiclky改变类型指出仅仅通过例如更换“double ***x”由“int ***x”。

在第二种方法中,我们全部更换“double”由“int”到sizeof

这是第一种方法有效,如果是,它建议?

感谢您的帮助

+2

您显示的代码存在一个小错误,它应该在第一个'malloc'调用中是'sizeof * x',第二个'sizeof ** x'中应该是'sizeof * x'。 –

+1

这的确是一个品味问题。 'x = malloc(N * sizeof(double **));'更明确地指明你正在分配的内容(这里指向double的指针)。另一方面,如果你决定使用'float'的long double而不是double,'x = malloc(N * sizeof(** x));'不会改变。这两种方法都是有效的,没有比其他更推荐的 - 除了项目或组织中的本地规则 –

+2

哦,并被称为[三星程序员](http://c2.com/cgi/wiki? ThreeStarProgrammer)通常不是*恭维。 –

回答

1

它有效吗?是(原则上)。 sizeof运算符可以应用于某个类型(如第二个示例中),或同样适用于任何表达式(返回该表达式返回的类型的大小)。所以它是有效的。我说“原则上”是因为你错误地将错误的表达式传递给错误的malloc调用。

是否建议使用?嗯,我会推荐它,因为你已经说过的原因。

0

我更喜欢第一种方法。它与DRY原则保持一致,并允许您轻松地看到分配的内存是正确的大小。