来自这个问题“What does (int (*)[])var1 stand for?”我试图像多维数组一样访问演员表的结果。但我收到以下错误:“assignment from incompatible pointer type
”后面跟着一个细分错误。我也尝试了其他一些变化,但没有一个变化。如何直接访问函数var1
中example
中的元素?
谢谢!
#include <stdlib.h>
int i(int n,int m,int var1[n][m]) {
var1[0][0]=5;
return var1[0][0];
}
int example() {
int *var1 = malloc(100);
// works
int var2;
var2 = i(10,10,(int (*)[])var1);
printf("var2=%i",var2);
//doesn't work I
int *var3;
var3=(int (*)[])var1; //"assignment from incompatible pointer type"
printf("var3[0][0]=%i",var3[0][0]);
//doesn't work II
int *var4;
var4=var1;
printf("var4[0][0]=%i",var4[0][0]); //" error: subscripted value is neither array nor pointer"
//doesn't work III
int **var5;
var5=var1;
printf("var5[0][0]=%i",var5[0][0]); // assignment from incompatible pointer type
return(1);
}
int main(){
int a;
a=example();
return(1);
}
答案 0 :(得分:3)
int *var3;
var3 = (int (*)[])var1;
您正在向var1
投射int*
int(*)[]
(指向int数组的指针)并将其分配给var3
,而int*
再次为var3 = var1
。
只做
{{1}}
答案 1 :(得分:1)
给它一个机会。以下编译时没有警告,并在C99(gcc -std=c99 -pedantic -Wall
)下运行:
#include <stdio.h>
#include <stdlib.h>
int i(int n, int m, int (*var1)[m]) // C89 requires constant expression for
{ // array size
int j, k;
for (j = 0; j < n; j++)
for (k = 0; k < m; k++)
var1[j][k] = j*m+k;
return var1[0][0];
}
int example(void)
{
int *var1 = malloc(100 * sizeof *var1); // Thanks, Joseph!
int var2 = i(10, 10, (int (*)[10]) var1); // note the cast of var1 includes
// the array size
int (*var3)[10] = (int (*)[10]) var1; // note the type of var3
int j, k;
for (j = 0; j < 100; j++)
printf("var1[%2d] = %d\n", j, var1[j]);
for (j = 0; j < 10; j++)
for (k = 0; k < 10; k++)
printf("var3[%2d][%2d] = %d\n", j, k, var3[j][k]);
free(var1);
return var2;
}
int main(void)
{
int x = example();
printf("x = %d\n", x);
return 0;
}
首先,请注意类型和演员表(最重要的是,请注意它们是如何匹配的)。请注意,我在指向数组的转换中指定了数组维度的大小。另请注意,我将var3
声明为指向数组的指针,而不是简单的指针。
答案 2 :(得分:0)
var3
必须是int**
而不是int*
。
修改强>
您正在尝试使用2D数组语法,其中您创建的实际数据实际上是一维数组。您可以使用i()
函数为您提供所需的语义,但需要将数据访问转换为函数内的1D索引。只需让你的功能看起来像这样:
int i(int n,int m,int* var1, int maxM) {
return var1[(maxM * n) + m];
}
答案 3 :(得分:0)
int example() {
int *var1 = malloc(100);
...
int *var3;
var3=var1;
printf("var3[0][0]=%i",var3[0][0]); //" error: subscripted value is neither array nor pointer"
return(1);
}
此处,var1
和var3
都属于int*
类型,大致类似于int[]
。您已经创建了一维数组,并尝试将它们作为二维数组进行访问。将他们的类型更改为int**
,分配必要的内存,这应该可以解决您的问题。
答案 4 :(得分:0)
也许您正在寻找的是:
int (*var1)[10][10] = malloc(sizeof *var1); // 400 bytes
i(10, 10, *var1);
printf("var1[0][0]=%i\n", (*var1)[0][0]);
已添加: gcc 的完整代码片段可能是:
#include <stdio.h>
#include <stdlib.h>
void i(int n, int m, int var1[][m]) { // n not needed
var1[0][0] = 5;
var1[1][2] = 6;
}
int main(void) {
int n = 10, m = 10;
int (*var1)[n][m] = malloc(sizeof *var1); // 400 bytes
i(n, m, *var1);
printf("var1[0][0]=%i\n",(*var1)[0][0]);
printf("var1[1][2]=%i\n",(*var1)[1][2]);
return 0;
}
对于 msvc ,您需要制作n和m 常量,如下所示:
enum {n = 10, m = 10};
void i(int var1[][m]) {
var1[0][0] = 5;
var1[1][2] = 6;
}
int main(void) {
int (*var1)[n][m] = malloc(sizeof *var1);
i(*var1);
// ...
}