我正在尝试设置两个数组,假设数组myflags_init和数组三重P;两个数组都是两个二元数组,因为tripleP是一个指向数组myflags_init中相应索引的指针数组。下面是我的代码,编译工作正常。我想讨论一下这是否有意义,因为语法对我来说有点疯狂(例如,int **tripleP[2] 用于声明 int 指针的二元数组 tripleP)。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int m;
for (m = 0; m < 20; m++)
{
int *myflags_init[2];
myflags_init[0] = (int *) calloc(2, sizeof(int));
myflags_init[1] = (int *) calloc(2, sizeof(int));
int r, k;
for (r = 0; r < 2; r++)
{
for (k = 0; k < 10; k++)
{
myflags_init[r][k] = 0; /* initialize the two-d array to 0 */
}
}
int false_num = 0;
int **tripleP[2];
tripleP[0] = (int **) calloc(10, sizeof(int **));
tripleP[1] = (int **) calloc(10, sizeof(int **));
for (r = 0; r < 2; r++)
{
for (k = 0; k < 10; k++)
{
tripleP[r][k] = &myflags_init[r][k]; /* tripleP pointers point to the corresponding index in myflags_init */
}
}
}
return 0;
}
int **tripleP[2];
tripleP[0] = (int **) calloc(10, sizeof(int **));
tripleP[1] = (int **) calloc(10, sizeof(int **));
这行得通,但不应该这样写。您要分配一个int*
数组,而不是int**
。然而,碰巧两种类型具有相同的大小(它们都是指针),因此无论如何这都会起作用。但为了清楚起见,请用这个替换它:
int **tripleP[2];
tripleP[0] = (int **) calloc(10, sizeof(int *));
tripleP[1] = (int **) calloc(10, sizeof(int *));
此外,myflags_init[0]
和 myflags_init[1]
的初始化也是错误的,因为您为每个元素分配了2
个元素,但尝试初始化其中10
个元素:
myflags_init[0] = (int *) calloc(2, sizeof(int));
myflags_init[1] = (int *) calloc(2, sizeof(int));
//...
for (k = 0; k < 10; k++)
此外,您无需手动将它们设置为零。这正是calloc
已经为您所做的(与malloc
相反)。
外部 for 循环似乎毫无意义,更不用说内存泄漏了,因为您不断分配新内存但从不调用free
。