如何调用main之外的函数创建的二维数组?

时间:2011-11-11 04:21:41

标签: c function

我对头部,返回和调用的外观感到困惑。

这就是错误“指针类型错误”

的原因
        int **CreatesArray (int r,int c)
    {
        int table [r][c];
        printf ("Enter clause orientations.\n");
        for (int i = 0; i<r;i++)
            {
                for (int j = 0;j<c;j++)
                    {
                        scanf ("%d",&table[i][j]);
                    }
            }
        return table;
    }

来自main的函数调用:

int **tableaux;

tableaux = CreatesArray(ROWS,COLS);

为什么这不是正确的做法?

注意:不久将发布TableCreator

4 个答案:

答案 0 :(得分:2)

为此,p必须是int***类型,或者您需要从作业中删除*

赋值指定要将TableCreator的调用结果放入p指向的内存地址。 TableCreator返回类型为int**的值,并且您在分配中有一个额外的间接级别。

答案 1 :(得分:2)

TableCreator返回指向指针的指针。您需要将该函数调用为

int **p;
p = TableCreator(arg1, arg2);

或其他类似的效果。为了告诉您有关如何使用p的任何信息,我们需要查看完整的函数TableCreator。

答案 2 :(得分:1)

函数TablCreator()返回一个int * *指针,因此p也必须是一个int * *指针。你没有给出完整的代码,所以我不知道p的类型。我认为变量p不是正确的类型。

答案 3 :(得分:1)

你的功能有点偏差。首先,您要在堆栈上创建二维数组table[r][c],并且不能从C中的函数返回堆栈分配的数组。

您必须在堆上分配表,然后返回该表。这是一个例子:

#include <stdio.h>
#include <stdlib.h>

int** create_table (int r,int c)
{
    // malloc the row pointers
    // in case you're wondering what I'm doing with sizeof(*table),
    // it's getting the size of *table which is the size of the 
    // underlying pointer type, because we will be allocating the 
    // column pointers. C allows this seemingly weird syntax 
    // because sizeof does not evaluate its operand.

    int **table = malloc(r * sizeof(*table));

    // for each row pointer, allocate 'c' column pointers
    for (int i = 0; i < r; ++i) {
        // sizeof(**table) gets the underlying type of a double-dereference,
        // which is sizeof(int) in this case.
        table[i] = malloc(c * sizeof(**table));
    }

    // read into your table
    for (int row = 0; row < r; ++row) {
        for (int col = 0; col < c; ++col) {
            printf("Enter orientation for table[%d][%d]: ", row, col);
            scanf ("%d",&table[0][0]);
        }
    }

    return table;
}

int main() {
    int row = 10;
    int col = 10;
    int **table = create_table(row, col);

    for (int r = 0; r < row; ++r) {
        for (int c = 0; c < col; ++c) {
            printf("table[%d][%d]: %d\n", r, c, table[r][c]);
        }
    }

    // free all the column pointers
    for (int i = 0; i < row; ++i) {
        free(table[i]);
    }

    // free the row pointers
    free(table);

    return 0;
}

如果您不了解C内存分配和管理,请阅读以下内容: