C下标值既不是数组也不是指针也不是向量

Posted

技术标签:

【中文标题】C下标值既不是数组也不是指针也不是向量【英文标题】:C subscripted value is neither array nor pointer nor vector 【发布时间】:2012-08-07 23:29:53 【问题描述】:
int * matrixsum(int *a,int *b,int n,int m)

    int *p=NULL,i,j;
    p=malloc(sizeof(int)*n*m);
    if(p==NULL)
    
        printf("Error!\n");
        exit(1);
    
    for(i=0;i<n;i++)
    
        for(j=0;j<m;j++)
        
            *(p+i*n+j)=*(a+i*n+j)+*(b+i*n+j);
        
    
    return p;

我的问题是关于 *(p+i*n+j)=*(a+i*n+j)+*(b+i*n+j); 行:如果我用 p[i][j]=a[i][j]+b[i][j]; 替换它,我会收到以下错误 3 次:

错误:下标值既不是数组也不是指针也不是向量

为什么?据我所知,它们是一回事。

我的编译器是 gcc 版本 4.6.3。

【问题讨论】:

你必须说p[i * n +j]等等。你只有一个一维数组。 无关:您的索引算法错误,*(p+i*n+j)=*(a+i*n+j)+*(b+i*n+j); 应使用m 而不是n 数组和指针绝对不是一回事。阅读comp.lang.c FAQ 的第 6 节。 请注意,错误消息中的“向量”可能指的是gcc extension,而不是C++向量。 @KeithThompson 很高兴知道。 【参考方案1】:

它们根本不是一回事——这就是编译器抱怨的原因!你可以写:

p[i*n+j] = a[i*n+j] + b[i*n+j];

p 的类型是int *;因此p[i] 的类型是int,你不能下标int。您必须传递int 的二维数组或指向int 的指针数组,才能使用p[i][j] 表示法。例如,在 C99 中(使用可变长度数组 — 并注意参数的重新排序):

int *matrixsum(int n, int m, int a[m][n], int b[m][n])

    ...
    p[i][j] = a[i][j] + b[i][j];
    ...

或者,在设置过程中非常小心,您可以使用:

int *matrixsum(int **a, int **b, int m, int n)

    ...
    p[i][j] = a[i][j] + b[i][j];
    ...

请注意,对于后一个示例,您不能简单地写:

int a[4][4] =  ... ;
int b[4][4] =  ... ;
int r = matrixsum(a, b, 4, 4);

2D 数组的内存分配与 int ** 表示法所需的内存分配完全不同。

【讨论】:

【参考方案2】:

据我所知,它们是一回事

是的,您已正确地将线性索引转换为下标,但所有 3 个变量的类型都错误,无法应用这些下标。它们必须是 int ** 类型,您才能进行二维数组索引。

【讨论】:

实际的二维数组(数组的数组)不是int**【参考方案3】:

编译器只是告诉您不能取消引用整数。 p 只是一个 int 指针 - 同样适用于 abc。您可以模拟 p[i][j] 通过对缓冲区执行棘手的指针运算,但不能取消引用 int

这些变量必须是int **,然后才能将它们用作二维数组,使用数组下标。

【讨论】:

【参考方案4】:

在第二种形式中,编译器如何猜测 n 是您的选项卡(不是他的)的第一个维度的长度?计算 &t[i][j] == *(t + i * n + j)

【讨论】:

以上是关于C下标值既不是数组也不是指针也不是向量的主要内容,如果未能解决你的问题,请参考以下文章

C 下标值不是数组、指针或向量 - 是吗?

访问二维数组中的元素时出错

创建指向二维数组的指针

Pytorch中的squeeze()和unsqueeze()函数

指针是不是有可能在没有任何数据副本的情况下由向量拥有?

为啥字符串不是向量的(子类)?