C:传递二维指针数组作为参数

时间:2013-06-01 14:07:43

标签: c pointers data-structures linked-list

我正在使用2d指针数组,每个指针指向一个链接的产品列表。 我想构建一个列出所有列表中所有产品的函数。 这是我的结构:

typedef struct object product, *pprod;
struct object{
int type;
int quantity;
pprod next;
};

这就是我定义数组的方式(它必须是动态的):

n=4;
m=3;
pprod (*t)[m] = malloc(n * sizeof *t);
list_all(t,n,m);

这是显示所有产品的功能:

void list_all(pprod** t , int size_n , int size_m) {
int i,j;

    for(i=0;i<size_n;i++){
        printf("--- Corridor ---: %d\n", i);
        for(j=0;j<size_m;j++){
            printf("--- Shelf ---: %d\n",j);
            printf("product:%d quantity:%d",t[i][j]->type,t[i][j]->quantity);
            }
     }
}

我在将数组作为参数传递时遇到了麻烦。你能帮我找到问题吗? 谢谢您的帮助。

3 个答案:

答案 0 :(得分:1)

好吧,首先创建数组是错误的。你只是将一个(单个)大小为4的向量分配给第m + 1个元素(t向量,除非你在别处做,指向随机区域)。

n=4;
m=3;
product **t, *newitem;

t= (product **)calloc(n, sizeof(product *));  // array of n pointers (corridor)
for (int i= 0; i<n; i++) {
    t[i]= (product *)calloc(m, sizeof(product))  // array of m prod structs (m shelfs per corridor)
}
// access some array members (t[n][m] max t[0-2][0-3])
t[0][0].type= 0;
t[0][0].quantity= 0;
t[0][1].type= 1;
t[0][1].quantity= 11;
...
t[1][2].type= 12;
t[1][2].quantity= 1212;
....
t[2][3].type= 23;
t[2][3].quantity= 2323;

// more products could be linked to the existing ones
newitem= calloc(1, sizeof product);
newitem->type= 231;
newitem->quantity= 231231;
t[2][3].next= newitem;

// now list them via below function
list_all(t,n,m);
....


void list_all(product **t , int size_n , int size_m) 
{
    int i,j;
    product *p;

    for(i=0;i<size_n;i++){
        printf("--- Corridor ---: %d\n", i);
        for(j=0;j<size_m;j++){
            printf("--- Shelf ---: %d\n",j);
            p= &t[i][j]; 
            do { 
                 printf("product:%d quantity:%d", p->type, p->quantity);
                 p= p->next;
            } (while p!=NULL);
        }
     }
}

有关详细信息,请参阅我在Etienne的回答中的评论。

答案 1 :(得分:1)

从您的问题描述中,您想要代表i走廊* j shelfs * k产品,其中每个产品都有数量和类型。

在你的问题中,你说你想要使用2D数组指针,但你的函数list_all将3D数组作为第一个参数(t的类型为object***)。此外,您的结构object应该是一个链接列表节点,因为它有next成员,但您使用它就像一个数组,例如t[i][j]->quantity,它无法工作和尝试访问未分配的内存。

为了帮助减少这种混淆,更明确地命名变量并避免使用一个字母变量名(问题中的n,m,t),但循环迭代器除外。您的程序将更容易阅读,这些问题将更容易出现。

以下是使用3D阵列解决问题的有效方法:

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

typedef struct object prod;

struct object {
int type;
int quantity;
};

void list_all(prod ***shop, int nb_corridors , int nb_shelfs, int nb_prods) 
{
    int i,j,k;
    for (i = 0; i < nb_corridors; i++) {
        printf ("--- Corridor ---: %d\n", i);
        for (j = 0; j < nb_shelfs; j++) {
            printf ("--- Shelf ---: %d\n", j);
            for (k = 0; k < nb_prods; k++) {
                printf ("--- Product ---: %d\n", k);
                printf ("type:%d quantity:%d\n", 
                        shop[i][j][k].type, shop[i][j][k].quantity);
            }
        }
    }
}

int main(void) 
{
    int nb_corridors = 4;
    int nb_shelfs = 5;
    int nb_prods = 3;
    prod ***shop;

    // array of n pointers (corridor)
    shop = malloc(nb_corridors * sizeof(*shop)); 
    printf("sizeof(*shop)=%ld\n", sizeof(*shop));

    int i, j;
    for (i = 0; i < nb_corridors; i++) {
         // nb_shelfs shelfs per corridor)
        shop[i] = malloc(nb_shelfs * sizeof(*shop[i]));     
        printf("sizeof(*shop[i])=%ld\n", sizeof(*shop[i]));
        for(j = 0; j < nb_shelfs; j++) {
            shop[i][j] = malloc(nb_prods * sizeof(*shop[i][j]));
            printf("sizeof(*shop[i][j])=%ld\n", sizeof(*shop[i][j]));
        }
    }

    //initialize with dummy values
    int k;
    for(i = 0; i < nb_corridors; i++) {
        for(j = 0; j < nb_shelfs; j++) {
            for(k = 0; k < nb_prods; k++) {
                shop[i][j][k].type = k;
                shop[i][j][k].quantity;
            }
        }
    }

    list_all(shop, nb_corridors, nb_shelfs, nb_prods);
    return 0;
}

答案 2 :(得分:0)

pprod已经是一个指针,我相信问题是你如何将参数传递给函数。

尝试更改为此函数原型: t已经是指向指针的指针,无论如何你都不能改变它。

void list_all(pprod* t , int size_n , int size_m) {