我对头部,返回和调用的外观感到困惑。
这就是错误“指针类型错误”
的原因 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
答案 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内存分配和管理,请阅读以下内容: