获取错误:尝试在C中实现交错数组时需要左值

获取错误:尝试在C中实现交错数组时需要左值,c,pointers,lvalue,jagged-arrays,double-pointer,C,Pointers,Lvalue,Jagged Arrays,Double Pointer,我试图在学习C语言时实现锯齿数组的概念 我的代码如下:- #include<stdio.h> #include<stdlib.h> int main() { int r,**a,n,i,j,*ptr; do { printf("Enter no. of Rows : "); scanf("%d",&r); if(r<0) printf("\nPlease enter a

我试图在学习C语言时实现锯齿数组的概念

我的代码如下:-

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

int main() {
    int r,**a,n,i,j,*ptr;
    do {
        printf("Enter no. of Rows : ");
        scanf("%d",&r);
        if(r<0)
            printf("\nPlease enter a positive value\n\n");
    } while(r<0);
    a = (int**)malloc(r * sizeof(int*));
    for(i=0; i<r; i++) {
        printf("\n");
        do {
            printf("Enter no. of elements in row %d : ",i+1);
            scanf("%d",&n);
            if(n<0)
                printf("\nPlease enter a positive value\n\n");
        } while(n<0);
        *(a+i) = (int*)malloc((n+1) * sizeof(int));
        printf("\n");
        printf("Input Row %d elements : ",i+1);
        for(j=0; j<n; j++)
            scanf("%d",&(*(*(a+i)+j)));
        (*(a+i))+j = NULL;
    }
    printf("\n\nYou entered :-\n\n");
    for(i=0; i<r; i++) {
        for(j=0; (*(a+i))+j; j++)
            printf("%d\t",*(*(a+i)+j));
        printf("\n");
    }
    for(i=0; i<r; i++)
        free(*(a+i));
    free(a);
    return 0;
}
#包括
#包括
int main(){
整数r,**a,n,i,j,*ptr;
做{
printf(“输入行数:”);
scanf(“%d”、&r);

如果(r括号在
中的设置方式(*(a+i))+j
导致它是一个右值。很可能是一个输入错误


你不能用更简单的
a[i][j]
语法吗?这样括号错误的可能性更小。

a
有一个类型
int**
(指向指针的指针)。
(a+i)
有相同的类型,
*(a+i)
是指针,
*(a+i)+j
也是一个指针。问题是您试图分配给一个临时对象,它是由“+”运算符创建的。事实上,您要求编译器为您解一个方程,然后修改
*(a+i)
,因为它是表达式中存储在内存中的唯一值

您唯一可以做的事情是将其分配给
*(a+i)
(并因此设置行的位置)或
*(*(a+i)+j)
(并设置行中特定元素的值),或分配给
a
本身(并设置指向行的指针的位置)

这不是Java,int没有NULL值。C中的NULL是一个扩展为零的宏,可以在以后转换为NULL指针

因此,如果用户键入零,(n+1)元素的分配是无用的。但是,您可以将
a
的类型更改为
int***
,并在每个单元格中存储指向单个
int
或NULL的指针。然而,这是一个巨大的开销,我不会这样做。您最好将每行的长度存储为其第一个元素


而且,正如Medinoc所建议的那样,使用
[]
而不是星号和加号。
a[b]
*(a+b)

基本上我想将指向数组第(I,j)个元素的指针设置为null,并且[I][j]不会指向第(I,j)个元素的值。
&a[I][j]
(否则,
&(a[I][j])
)是的。所以不可能将指针设置为NULL并使用此概念。请对此进行确认。是的,这是不可能的。正如我所提到的,这样做的唯一方法是单独存储int并将指针存储在数组中。如果您不介意,请将最佳答案标记为您问题的答案,如果您认为这正是y的意思你想要的。谢谢你的时间和解释。
printf("Input Row %d elements : ",i+1);
for(j=0; j<n; j++)
    scanf("%d",&(*(*(a+i)+j)));
(*(a+i))+j = NULL;