c - struct Complex (*ptr1)[4] 和 struct Complex *ptr1 之间的区别

标签 c

以下声明有什么区别?

  1. 结构体 *ptr1=(结构体*)malloc(4*sizeof(结构体));
  2. 结构体 (*ptr1)[4]=(结构体*)malloc(sizeof(结构体));

哪个更好用?

最佳答案

首先让我们清理一下这些调用。 C 不要求您强制转换 malloc 的结果,这样做被认为是不好的做法(另一方面,C++确实需要强制转换,但您不应该这样做)不要在 C++ 中使用 malloc)。此外,您可以将取消引用的目标作为操作数传递给 sizeof,因此任何 malloc 调用的基本形式如下所示

T *p = malloc( sizeof *p * N );

这为 T 类型的 N 个对象分配了足够的空间,并将结果指针分配给 p。每个元素都可以使用p[i]访问。

所以,在第一种情况下,你正在做

struct complex *ptr1 = malloc( sizeof *ptr1 * 4 );

这为 4 个 struct complex 类型的对象留出了空间,每个对象都通过 ptr1[i] 进行访问。这是更简单的情况。

struct complex (*ptr1)[4] = malloc( sizeof *ptr1 );

这为 1 个 struct complex [4] 类型的对象(IOW,struct complex 的 4 元素数组)留出了空间,并将结果指针分配给 ptr1。每个元素都可以作为 (*ptr1)[i] ptr1[0][i] 进行访问。如果您尝试为 struct Complex 的二维数组分配空间,您实际上只会使用这种形式:

struct complex (*p)[4] = malloc( sizeof *p * N );

这为 N 4 元素数组分配空间,或者更简单地为 Nx4 结构体数组分配空间。每个元素都可以作为 p[i][j] 进行访问。

关于c - struct Complex (*ptr1)[4] 和 struct Complex *ptr1 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38393918/

相关文章:

c - C 中的指针和字符串

c - eclipse /GDB : How to set an automatic breakpoint after hardware reset?

c - 在 C 中声明 int * p = & i; 是错误的吗?

c++ - 如果我知道 1+2+3+..+n=n*(n+1)/2 的结果,如何得到 n?

c - 包括头文件

c++ - OpenCV - cvExtractSURF 导致内存泄漏?

c++ - C、C++ : Shared libraries: Are single functions or complete libraries loaded into memory?

c - 如何使用 ld 链接 gcc 生成的 obj 文件

c - 有没有办法将未知类型的数组作为参数传递给 C 中的函数?

c - 有没有办法检查宏是否被定义为特定的东西?