c - 动态内存分配和指针?

标签 c pointers malloc sizeof

我试图理解这两个片段之间的区别。两者都工作得很好。

int rows = 4;

int **p = malloc(rows * sizeof(int **)); //it works without type casting

int**p = (int **) malloc(rows * sizeof(int*)); // using casting method.

sizeof(int**) 是什么意思?

最佳答案

分配 foo_t 的数组s,标准模式是以下之一:

foo_t *p = malloc(count * sizeof(foo_t));
foo_t *p = malloc(count * sizeof(*p));

您可以说“给我count个尺寸为s的元素”,其中尺寸为sizeof(foo_t)sizeof(*p) 。它们是等效的,但第二个更好,因为它避免了写入 foo_t两次。 (这样,如果您将 foo *p 更改为 bar *p,您就不必记得将 sizeof(foo_t) 更改为 sizeof(bar_t) 。)

因此,要分配一个 int * 的数组,替换foo_tint * ,产生:

int **p = malloc(count * sizeof(int *));
int **p = malloc(count * sizeof(*p));

请注意,正确的大小是 sizeof(int *) ,不是sizeof(int **) 。两颗星太多了。您写的第一个片段 sizeof(int **)因此,是错误的。它似乎有效,但这只是运气。

另请注意,我没有包含 (int **) throw 。 Actor 阵容会起作用,但是it's a bad idea to cast the return value of malloc() 。强制转换是不必要的,并且可能隐藏一个微妙的错误*。请参阅linked question以获得完整的解释。

<小时/>

* 即,忘记 #include <stdlib.h> .

关于c - 动态内存分配和指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54756055/

相关文章:

c - fscanf() 代码并不总是会导致内存崩溃,但有时

c - 不超过特定字符的字符串长度

c - C代码的基本错误

c - 在 os x 上编译 libuv 的库?

c++ - 哪一种是在 C++ 中分配未初始化内存的最惯用的方法

c - 由于 malloc() 语法错误,程序崩溃

c - 使用 memcpy 将结构复制到堆中

c - (2 - 4 = -1) 当 int 值赋给 C 中的指针时?

c++ - 使用双指针,从 **void 进行转换。 (未处理的异常 0xC0000005 : Access violation)

c - float* 类型的变量应该指向单个 float 还是一系列 float ?