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



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

相关内容

  • 没有找到相关文章

最新更新