C (int**)马洛克(sizeof(int*))

C (int**)马洛克(sizeof(int*)),c,malloc,double-pointer,C,Malloc,Double Pointer,我知道为了malloc一个指向数组的指针数组,语法应该是: (int**)malloc(numberOfDesiredElements*sizeof(int*)) 不小心,我忘了把numberofdesiredements*放在size前面。它搞乱了我的程序,抛出随机分段错误,即有时程序输出正确,有时程序seg出错 有人能解释一下,当我没有指出我想要多少插槽时发生了什么吗 谢谢 这只是一个普通的乘法,而不是神奇的语法;因此它将空间分配给1而不是3。这只是一个普通的乘法,而不是神奇的语法;因此,

我知道为了
malloc
一个指向数组的指针数组,语法应该是:

(int**)malloc(numberOfDesiredElements*sizeof(int*))
不小心,我忘了把
numberofdesiredements*
放在size前面。它搞乱了我的程序,抛出随机分段错误,即有时程序输出正确,有时程序seg出错

有人能解释一下,当我没有指出我想要多少插槽时发生了什么吗


谢谢

这只是一个普通的乘法,而不是神奇的语法;因此它将空间分配给1而不是3。

这只是一个普通的乘法,而不是神奇的语法;因此,它将空间分配给1而不是3。

更好的书写方式是

int **p = malloc(numberOfDesiredElements * sizeof *p);
更清晰、更易于阅读,而且您不必担心在
sizeof
表达式中保持键入的笔直。不需要强制转换(C中,C++中需要,但不应该在C++中使用<代码> MalOC ),如果没有在 MalOC/范围内的原型,则可以抑制有用的诊断。p>
至于当您分配的空间比预期的少时会发生什么,那么,您超出了定义行为的界限。如果你做了一些重要的事情,你会得到一个运行时错误。如果您没有这样做,您的代码将正常工作

更好的写作方式是

int **p = malloc(numberOfDesiredElements * sizeof *p);
更清晰、更易于阅读,而且您不必担心在
sizeof
表达式中保持键入的笔直。不需要强制转换(C中,C++中需要,但不应该在C++中使用<代码> MalOC
),如果没有在 MalOC/范围内的原型,则可以抑制有用的诊断。p>
至于当您分配的空间比预期的少时会发生什么,那么,您超出了定义行为的界限。如果你做了一些重要的事情,你会得到一个运行时错误。如果您没有这样做,您的代码将正常工作

是乘法吗?哦随机seg故障怎么办?@Rafcio:如果你说
malloc(sizeof(int))
,你就有足够的内存来存储一个int。如果你试图在其中填充多个int,你就处于未定义的行为领域——任何事情都可能发生。(并使用
calloc
来避免这种情况。)如果您假设您有3个空间,但只有1个空间,那么您正在写入其他对象使用的内存(可能会损坏指针),或者写入根本没有分配的内存(segfault)。对。谢谢,伙计们!我想我知道。。。也许我该到此为止:|这是乘法?哦随机seg故障怎么办?@Rafcio:如果你说
malloc(sizeof(int))
,你就有足够的内存来存储一个int。如果你试图在其中填充多个int,你就处于未定义的行为领域——任何事情都可能发生。(并使用
calloc
来避免这种情况。)如果您假设您有3个空间,但只有1个空间,那么您正在写入其他对象使用的内存(可能会损坏指针),或者写入根本没有分配的内存(segfault)。对。谢谢,伙计们!我想我知道。。。也许我应该到此为止:|语法不应该是这样。避免不必要的强制转换。
malloc
返回可隐式转换为
int**
void*
。如果缺少malloc的原型,显式转换可能会隐藏错误。语法不应该是这样。避免不必要的强制转换。
malloc
返回可隐式转换为
int**
void*
。如果在
sizeof*p
…-尽管关于可读性,我还是更喜欢
sizeof(*p)
+1作为
sizeof*p
..-尽管关于可读性,我还是更喜欢
sizeof(*p)