我试图在学习C语言的同时实现Jagged的概念。
我的代码如下:-
#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;
}在编译时会出现一个错误:-
26错误:作为分配的左操作数所需的lvalue
基本上,对于这一行代码,我得到每个指针元素的值&将每行中的最后一个指针元素赋值为null :-
printf("Input Row %d elements : ",i+1);
for(j=0; j<n; j++)
scanf("%d",&(*(*(a+i)+j)));
(*(a+i))+j = NULL;基本上,这个Jagged的概念是,它分别输入行数和每个行中的元素数,并输入多个元素。
我在每一行指针中创建一个动态数组(n+1) *sizeof of (Int),其中n是该行中的元素数。(n+1)th元素用于存储一个空指针,以便在显示数组的同时,我们可以获得到下一行的位置。
很抱歉发布了整个代码,但是由于我不知道代码中的问题是从哪里产生的,所以我已经发布了整个代码。
任何帮助都将不胜感激。
谢谢你
发布于 2013-11-14 14:59:38
a有一个类型int** (指向指针的指针)。(a+i)具有相同的类型,*(a + i)是指针,*(a + i) +j也是指针。问题是,您正在尝试分配给一个临时对象,该对象是由'+‘操作符创建的。实际上,您要求编译器为您求解一个方程,然后修改*(a + i),因为它是存储在内存中的表达式中的唯一值。
您可以做的唯一事情是将其分配给*(a+i) (因此可以设置行的位置)或*(*(a+i)+j) (以及行中特定元素的设置值),或者分配给a本身(以及设置指向行的指针的位置)。
这不是Java,int没有空值。C中的NULL是一个宏,它可以扩展为零,然后可以抛出为空指针。
因此,如果用户类型为零,则(n+1)元素的分配是无用的。然而,您可以将a的类型更改为int***,并在每个单元格中存储指向单个int或NULL的指针。然而,这是一个很大的开销,我不会这样做。您最好将每一行的长度存储为其第一个元素。
而且,正如Medinoc所建议的,使用[]代替星号和加法。a[b]和*(a+b)是一样的。
发布于 2013-11-14 14:57:13
在(*(a+i))+j中设置括号的方式使其成为一个rvalue。很可能是个错误。
你就不能用更简单的a[i][j]语法吗?以这种方式,括号错误的可能性较小。
https://stackoverflow.com/questions/19980713
复制相似问题