我正在尝试设置两个数组,比如数组 myflags_init 和数组 tripleP ;两个数组都是两个维数,因为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;
}
答案 0 :(得分:1)
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
。