我正试图将一个文件发送到一个函数,该函数创建一个名为Entry的结构矩阵,根据该文件填充它,并返回矩阵。现在,如果需要的话,我可以添加一连串的错误,但我怀疑我只是犯了多个愚蠢的错误。如果有一种更简单的方法不涉及malloc,那也同样有效。
我做错了什么?我该怎么做?
这是相关代码:
Entry **matCreate(FILE *fp){
// initialize matrix
Entry matrix = malloc(states * N_CC * sizeof(Entry));
// populate the matrix with initial values
for (int i = 0; i < states; i++) {
for (int j = 0; j < N_CC; j++) {
matrix[i][j].next = 99;
matrix[i][j].action = "D";
}
}
return matrix;
}
和在主要功能:
Entry **matrix = matCreat(fp);
我用启动功能
Entry **matCreate(FILE *fp){
用初始化
Entry (*matrix)[N_CC] = malloc( states * sizeof *matrix );
用填充
for (int i = 0; i < states; i++) {
for (int j = 0; j < N_CC; j++) {
matrix[i][j].next = 99;
matrix[i][j].action = "D";
}
}
从main中获取:条目ourMat=(*matCreate(fp))[N_CC];
但仍然得到错误:tokenize.c:84:1:警告:从不兼容的指针类型返回[默认启用]
我哪里错了?
C没有真正的多维数组类型。您必须返回一个锯齿状数组,或者返回一个数组数组。(此外,由于数组不能按值返回;在这两种情况下,您都必须动态分配数组,并返回指向它的指针)。进一步阅读。
对于arrays选项的array,您可以这样声明和分配它:
Entry (*matrix)[N_CC] = malloc( states * sizeof *matrix );
通过将此模式用于malloc的参数,您可以避免担心任何复杂的事情。
返回此指针的函数类型为:
Entry (*matCreate(FILE *fp))[N_CC];
在调用代码中,您可以使用以下函数:
Entry (*matrix)[N_CC] = matCreate(fp);
bar( matrix[1][2].action );
您可以使用typedef来简化所有这些语法。就我个人而言,我不喜欢这样做,因为当数组指针衰减时就不那么明显了。
您需要将malloc返回指针分配给Entry**
Entry **matrix;
matrix= (Entry**)malloc(states * sizeof(Entry *));
for (i = 0; i < states; i++)
Entry[i] = malloc(N_CC * sizeof(Entry));