首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取错误:在C中实现Jagged时所需的lvalue

获取错误:在C中实现Jagged时所需的lvalue
EN

Stack Overflow用户
提问于 2013-11-14 14:47:54
回答 2查看 331关注 0票数 0

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

我的代码如下:-

代码语言:javascript
运行
复制
#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 :-

代码语言:javascript
运行
复制
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元素用于存储一个空指针,以便在显示数组的同时,我们可以获得到下一行的位置。

很抱歉发布了整个代码,但是由于我不知道代码中的问题是从哪里产生的,所以我已经发布了整个代码。

任何帮助都将不胜感激。

谢谢你

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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)是一样的。

票数 1
EN

Stack Overflow用户

发布于 2013-11-14 14:57:13

(*(a+i))+j中设置括号的方式使其成为一个rvalue。很可能是个错误。

你就不能用更简单的a[i][j]语法吗?以这种方式,括号错误的可能性较小。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19980713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档