Min*_*any 15 c arrays malloc struct pointers
我有以下结构:
typedef struct _chess {
int **array;
int size;
struct _chess *parent;
} chess;
Run Code Online (Sandbox Code Playgroud)
我有:
typedef struct _chess *Chess;
Run Code Online (Sandbox Code Playgroud)
现在,我想创建一个动态长度数组来存储指向ARCH结构的指针,所以我执行以下操作:
Chess array [] = malloc(size * sizeof(Chess));
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误:初始化程序无效.
如果我放弃[]并执行此操作:
Chess array = malloc(size * sizeof(Chess));
Run Code Online (Sandbox Code Playgroud)
它编译没有错误,但当我尝试通过执行以下操作将此数组的元素设置为NULL:
array[i]=NULL;
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:从类型'void*'分配类型'struct _chess'时出现不兼容的类型
知道我做错了什么吗?谢谢.
CB *_*ley 45
array是一个有点误导性的名字.对于动态分配的指针数组,malloc将返回指向内存块的指针.您需要使用Chess*而不是Chess[]保持指向您的数组的指针.
Chess *array = malloc(size * sizeof(Chess));
array[i] = NULL;
Run Code Online (Sandbox Code Playgroud)
也许后来:
/* create new struct chess */
array[i] = malloc(sizeof(struct chess));
/* set up its members */
array[i]->size = 0;
/* etc. */
Run Code Online (Sandbox Code Playgroud)
unw*_*ind 22
这里有很多typedef事情要做.就个人而言,我反对"隐藏星号",即typedef:将指针类型转换为看起来不像指针的东西.在C中,指针非常重要并且真正影响代码,foo并且和之间有很多区别foo *.
我认为,许多答案也对此感到困惑.
你分配一个Chess值数组,这是指向类型值的指针chess(同样,一个我真的不能推荐的非常令人困惑的命名法)应该是这样的:
Chess *array = malloc(n * sizeof *array);
Run Code Online (Sandbox Code Playgroud)
然后,您需要通过循环初始化实际实例:
for(i = 0; i < n; ++i)
array[i] = NULL;
Run Code Online (Sandbox Code Playgroud)
这假设你不想为实例分配任何内存,你只需要一个指针数组,所有指针最初都指向什么.
如果你想分配空间,最简单的形式是:
for(i = 0; i < n; ++i)
array[i] = malloc(sizeof *array[i]);
Run Code Online (Sandbox Code Playgroud)
了解sizeof使用情况如何100%一致,并且从不开始提及显式类型.使用变量中固有的类型信息,让编译器担心哪种类型.不要重复自己.
当然,上面做了不必要的大量调用malloc(); 根据使用模式malloc(),在计算所需的总大小后,只需一次调用就可以完成上述所有操作.然后你仍然需要通过初始化array[i]指针来指向大块,当然.
| 归档时间: |
|
| 查看次数: |
105711 次 |
| 最近记录: |