在c中返回一个多维指针

时间:2014-06-23 05:58:44

标签: c

错误左值作为赋值的左操作数返回 这个程序有什么错误;

int(*matrix)[row][col];
int i = 0;
if(n == 1)
{
    for (int i = 0; i < no_matrices; i++)
    {
        printf("Matrix %d", i + 1);
        (matrix + i) = GetMatrixU(row, col); // (error here)
    }
}

int* GetMatrixU(int row, int col)

    srand(time(NULL));
    int(* matrix)[col] = malloc(col*sizeof(int));
    for (int i = 0; i < row; i ++)
    {
        for (int j = 0; j < col; j ++)
        {
            matrix[i][j] = rand()%100;
        }
    }
    return matrix[];
}

2 个答案:

答案 0 :(得分:1)

问题在于这一行:

(matrix + i) = GetMatrixU(row, col);

这会尝试进行分配。评估右侧的表达式;这是&#34; r-value&#34; (&#34; r&#34; for&#34; right&#34;)。然后应该将结果分配给左边的表达式,即&#34; l-value&#34; (&#34; l&#34; for&#34; left&#34;)。

好吧,(matrix + i)不是有效的l值。 matrix本身是指向二维数组的单个指针。在C中,你不能只指定一个指针值并赋值给它;您必须使用*运算符取消引用数组,并通过它进行分配。

这是一个简短的代码示例,演示如何取消引用指针,然后重复您的错误。

main()
{
    int a[10];
    *(a + 1) = 0;  // proper use of * to dereference
    a + 1 = 0; // will not compile; error is "l-value required"
}

但在C语言中,有一种快捷方式可以添加到指针然后取消引用它。它使用方括号和索引值:

a[1] = 0;  // index the array

在C中,根据定义,表达式*(a + i)a[i]的含义完全相同。

http://en.wikipedia.org/wiki/C_syntax#Accessing_elements

看起来您正在尝试一次创建一行随机矩阵。而且你正在为每一行分配内存。您的基本矩阵声明应该是指向行的指针数组。

int *matrix[rows];

for (i = 0; i < rows; ++i)
{
    // either of these lines will work; pick just one
    *(matrix + i) = AllocateRandomRow(cols);  // explicit add-and-dereference
    matrix[i] = AllocateRandomRow(cols);  // simpler: just index array
}

我赞成使用第二种更简单的语法来解决这个问题。您正在索引数组;只需使用方括号。

这是一个免费的在线文本,描述了如何动态分配矩阵。

http://www.eskimo.com/~scs/cclass/int/sx9b.html

答案 1 :(得分:0)

以下是了解更复杂案例的简单案例示例:

int b = 4;
int *a = &b; // Allowed and works because a is a pointer to an integer
a+1 = 5; // Not allowed no idea about the type of a+1 and it could be used!!

为什么这与你的问题有关?

int(*matrix)[5][5];
printf("%p\n",matrix);
printf("%p\n",matrix+1);

<强>输出

0xb7753000
0xb7753064

上述指针之间的差异是6 * 16 + 4 = 100.这个数字只不过是行* col * sizeOf(int)= 5 * 5 * 4 = 100

因此,你想要做的是访问矩阵中的单元格,但是你实际上正在尝试访问一个你不允许使用的内存,如第一个简单示例所示。

您实际执行的操作与您希望程序执行操作的示例:

int(*matrix)[5][5];
matrix + 0 => address of matrix
matrix + 1 => address of matrix + 100 bytes (you expected + 4 bytes instead)
matrix + 2 => address of matrix + 200 bytes (you expected + 8 bytes instead)
etc...