我正试图在C中创建一个指针数组。数组的每个值都应该是一个指向结构的指针(我们称之为struct-Type*)。
我应该做吗
struct Type* myVariable= malloc(sizeof(struct Type*)*MY_SIZE);
或
struct Type** myVariable= malloc(sizeof(struct Type*)*MY_SIZE);
第二个看起来像是当我想创建一个二维数组时应该做的,这是一个指针数组,这些指针用于创建所需类型的数组。编辑:但在我的情况下,二维尺寸将只有一个
第一个看起来像一个以int*作为包含值类型的正则数组。
如何将好的解决方案传递给函数(通过指针,而不是通过值,因为数组可能相当大)并在函数中使用它?
第二个是正确的解决方案。但是,您还需要为对象分配内存。此外,请确保检查malloc
返回的值。
// Allocate memory for the array of pointers.
struct Type** myVariable = malloc(sizeof(struct Type*)*MY_SIZE);
if ( myVariable == NULL )
{
// Deal with error
exit(1);
}
for (int i = 0; i < MY_SIZE; ++i )
{
// Allocate memory for the array of objects.
myVariable[i] = malloc(sizeof(struct Type)*THE_SIZE_IN_THE_OTHER_DIMENSION);
if ( myVariable[i] == NULL )
{
// Free everything that was allocated so far
for (int j = 0; j < i-1; ++j )
{
free(myVariable[j]);
}
free(myVariable);
// Exit the program.
exit(1);
}
}
然而,如果THE_SIZE_IN_THE_OTHER_DIMENSION
将是1
,那么最好使用第一种方法。
struct Type* myVariable = malloc(sizeof(struct Type)*MY_SIZE);
// ^^^^^^^^^^^ Drop the *
if ( myVariable == NULL )
{
// Deal with error
exit(1);
}
两者都没有!
使用减少工作量和错误的习惯用法
pointer = malloc(sizeof *pointer * Number_of_elements);
或者在OP的情况下"在C中创建指针数组"
#define ARRAY_N 100
struct Type **myVariable = malloc(sizeof *myVariable * N);
if (myVariable == NULL) Handle_OutOfMemmory();
现在将这些指针设置为某个值
#define M 50
size_t i;
for (i=0; i<N; i++) {
myVariable[i] = malloc(sizeof *(myVariable[i]) * M);
if (myVariable[i] == NULL) Handle_OutOfMemmory();
for (size_t m = 0; m<M; m++) {
// Initialize the fields of
myVariable[i][m].start = 0;
myVariable[i][m].value = 0.0;
myVariable[i][m].set = NULL;
}
}