一个整数数组和一个指向第一个数组的int指针数组,这有意义吗?

时间:2014-03-02 18:33:58

标签: c arrays malloc calloc

我正在尝试设置两个数组,比如数组 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;
}

1 个答案:

答案 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