2

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

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);
            }
     }
}

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

4

3 回答 3

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 的回答中的评论。

于 2013-06-01T14:22:45.670 回答
1

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

在您的问题中,您说您想使用 2D 指针数组,但您的函数list_all将 3D 数组作为第一个参数(t属于 type object***)。此外,您的结构object应该是一个链表节点,因为它有一个next成员,但是您像数组一样使用它,例如 with 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;
}
于 2013-06-01T16:38:49.333 回答
0

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

尝试更改为此函数原型: t 已经是指向指针的指针,并且无论如何您都没有更改它..

void list_all(pprod* t , int size_n , int size_m) {
于 2013-06-01T14:15:32.547 回答