使用C中的malloc动态创建指针的2D数组

时间:2015-06-11 10:22:42

标签: c arrays pointers malloc

这是我正在使用的结构:

struct nodeList//a node structure
{
    int jump;
    int config;
    int level;
    int shifts[200];
    int shift_diff[200];
    struct nodeList *next;
};

我想创建一个可用于引用此类结构变量的2D指针数组,即该数组的任何元素都可以分配一个指向结构变量的指针。如果可能的话,我更愿意使用malloc动态创建数组。任何指针(双关语意外)将不胜感激。

2 个答案:

答案 0 :(得分:2)

首先,请三思而后行。你真的需要一个2D指针数组,每个指针指向一个结构,每个结构包含许多项?这些要求相当复杂:如果你可以简化它们,你的程序会变得更好。

因为根据当前的要求,你会注意到指针和数组的语法会变得相当复杂,而这些要求应该归咎于C语言。

考虑使用结构的2D数组,或者使用某种基于指针的ADT,这对你的特定情况有用(链表,队列,图形,二叉树等等)。

话虽如此,指向struct的二维指针数组:

struct nodelist* array[X][Y];

要动态分配,需要一个指向结构指针的2D数组的指针:

struct nodelist* (*array_ptr)[X][Y];

然后将其分配给指向动态分配的struct的指针数组:

array_ptr = malloc( sizeof(struct nodelist*[X][Y]) );

...
free(array_ptr);

请注意,除非上面没有像上面那样分配2D数组,否则在相邻的存储单元中,它不是数组

EDIT。顺便说一句,如果你想避免数组指针会产生奇怪的语法,那就有一个技巧。使用上面的代码,您必须将数组作为

来处理
(*array_ptr)[i][j];

含义:“在2D数组中,给我项目编号[i] [j]”。

如果您省略了该类型的最内层维度,则可以简化此语法:

struct nodelist* (*array_ptr)[Y]; // pointer to a 1D array

malloc将是相同的,但您现在可以像这样使用它,这可能更直观:

array_ptr[i][j];

含义:“在数组编号i中,给我项目编号j”。你在这里假设相邻内存中有一个数组数组,这是真的。

答案 1 :(得分:0)

var currentTable = $('table');

function bindKeyDown(lastEditable) {
    lastEditable.keydown(function(e) {
        if(e.keyCode == 9) {
            createNewRow($(this));
        }
    });
}

function getLastEditable() {
    return currentTable
    .find("tr")
    .find('textarea, .cleanbox-editable-cell')
    .not(function(index, element) {
        return $(element).parent().css("display") == "none";
    })
    .last();
}

function createNewRow($lastEditable) {
    var newEditable = $lastEditable.parent().parent().clone().appendTo(currentTable);
    $lastEditable.unbind("keydown");
    bindKeyDown(getLastEditable());
}

bindKeyDown(getLastEditable());

这是动态分配的另一种方式,但正如@Lundin所说,如果没有必要改变设计。