gpt4 book ai didi

c - C语言中这个指向指针的指针语句是什么意思?

转载 作者:行者123 更新时间:2023-11-30 21:32:34 25 4
gpt4 key购买 nike

int **arr = (int **)malloc(r * sizeof(int *));

我应该如何解释上面的C代码的含义?

最佳答案

malloc() 的调用:

int **arr = (int **)malloc(r * sizeof(int *));

为指向intr指针分配空间,并返回指向分配的void *。然后,该指针被转换为 int ** 并分配给 arr,这是一个指向 int 指针的指针。因此,arr 指向分配区域的第一个元素,它是指向 int 的指针。此类代码可用于创建“锯齿状”数组,其中数组的每一行都是单独分配的;这意味着内存分配可能不连续,因此这不是真正的二维数组。请参阅Correctly allocating multi-dimensional arrays阅读更多相关内容。

不过,以上内容被认为是不好的风格。最重要的是,应尽可能避免使用显式类型作为 sizeof 运算符的参数:

int **arr = (int **)malloc(r * sizeof *arr);

如果arr的类型在代码生命周期中的某个时刻发生变化,这样就不容易出错,并且更容易维护。

此外,there is no need to cast the result of malloc() in C ,所以这个转换是多余的,只会让代码变得困惑:

int **arr = malloc(r * sizeof *arr);

作为最后的改进,在这种情况下,我更喜欢将 sizeof 表达式放在前面:

int **arr = malloc(sizeof *arr * r);

在上述特定情况下,这是一个无用的更改,但当存在额外的乘法时,例如:

int **arr = malloc(sizeof *arr * r * n);

这保证了算术运算的类型至少与size_t一样宽,从而降低了整数溢出的风险(signed整数溢出导致C中未定义的行为) ),并且可能会降低无符号整数环绕的风险(定义明确,但可能是意外或不受欢迎的)。

关于c - C语言中这个指向指针的指针语句是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46889469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com