0

我正在尝试在学习 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) 个元素用于存储空指针,以便在显示数组时我们可以在哪里找到下一行。

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

任何帮助,将不胜感激。

谢谢

4

2 回答 2

1

The way parentheses are set in (*(a+i))+j causes it to be an rvalue. Likely a typo.

Can't you just use the simpler a[i][j] syntax? Parenthesis errors are less likely this way.

于 2013-11-14T14:57:13.650 回答
1

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's 的类型更改为int***并在每个单元格中存储指向单个int或 NULL 的指针。但是,这是一个很大的开销,我不会这样做。您最好将每行的长度存储为其第一个元素。

并且,正如 Medinoc 建议的那样,使用[]星号和加号代替。a[b]是一样的*(a+b)

于 2013-11-14T14:59:38.250 回答