【问题标题】:Getting Error : lvalue required while trying to implement a Jagged Array in C出现错误:尝试在 C 中实现锯齿状数组时需要左值
【发布时间】:2013-11-27 15:27:24
【问题描述】:

我在学习C语言的同时尝试实现Jagged Array的概念。

我的代码如下:-

#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 错误:需要左值作为赋值的左操作数

基本上对于这行代码,我获取每个指针元素的值并将每行中的最后一个指针元素分配给 null :-

printf("Input Row %d elements : ",i+1);
for(j=0; j<n; j++)
    scanf("%d",&(*(*(a+i)+j)));
(*(a+i))+j = NULL;

这个锯齿状数组的基本概念是,它输入行数,然后分别输入每行中的元素数,然后输入那么多元素。

我在每个行指针中创建一个 (n+1) * sizeof(int) 的动态数组,其中 n 是该行中的元素数。第 (n+1) 个元素用于存储一个空指针,以便在显示数组时我们可以知道从哪里跳到下一行。

很抱歉发布了整个代码,但由于我不知道代码中的问题可能出在哪里,所以我发布了整个代码。

任何帮助将不胜感激。

谢谢

【问题讨论】:

    标签: c pointers lvalue jagged-arrays double-pointer


    【解决方案1】:

    (*(a+i))+j 中括号的设置方式使其成为右值。可能是笔误。

    你不能只使用更简单的a[i][j] 语法吗?这种方式不太可能出现括号错误。

    【讨论】:

    • 基本上我想将指向数组的第 (i,j) 个元素的指针设置为 null,并且不会 a[i][j] 指向 (i, j)th 元素。
    • &amp;a[i][j](否则,&amp;(a[i][j]))会。
    【解决方案2】:

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

    您唯一能做的就是分配给*(a+i)(因此设置行的位置)或*(*(a+i)+j)(并设置行中特定元素的值)或a本身(并设置行指针的位置)。

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

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

    并且,正如梅迪诺克所建议的,使用[] 而不是星号和加号。 a[b]*(a+b) 相同。

    【讨论】:

    • 因此无法将指针设置为 NULL 并使用此概念。请对此进行确认..
    • 是的,这是不可能的。正如我所提到的,做这样的事情的唯一方法是单独存储整数并将指针存储在数组中。如果您不介意,请将最佳答案标记为您的问题的答案,如果您认为这正是您想要的。
    • 感谢您的时间和解释。
    猜你喜欢
    • 2012-11-19
    • 1970-01-01
    • 2019-09-25
    • 2019-04-15
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多