获取错误:尝试在C中实现交错数组时需要左值
我试图在学习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
#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;