C 我可以用[]访问int(*)类型[]吗?

C 我可以用[]访问int(*)类型[]吗?,c,pointers,casting,multidimensional-array,C,Pointers,Casting,Multidimensional Array,从这个问题出发,我试图像多维数组一样访问强制转换的结果。但我得到以下错误:不兼容指针类型的赋值,后跟分段错误。我也尝试了一些其他的变化,但没有一个奏效。如何直接访问函数示例中var1中的元素 谢谢大家! #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);

从这个问题出发,我试图像多维数组一样访问强制转换的结果。但我得到以下错误:不兼容指针类型的赋值,后跟分段错误。我也尝试了一些其他的变化,但没有一个奏效。如何直接访问函数示例中var1中的元素

谢谢大家!

 #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);
}
您正在将已经是int*的var1强制转换为int*[]指向int数组的指针,并将其分配给再次是int*的var3

照办

var3 = var1
您正在将已经是int*的var1强制转换为int*[]指向int数组的指针,并将其分配给再次是int*的var3

照办

var3 = var1
var3需要是int**而不是int*

编辑

您试图使用2D数组语法,其中创建的实际数据实际上是一个1D数组。您可以使用i函数为您提供所需的语义,但数据访问需要在函数内部转换为1D索引。只需将函数设置为如下所示:

int i(int n,int m,int* var1, int maxM) {
  return var1[(maxM * n) + m];
}
var3需要是int**而不是int*

编辑

您试图使用2D数组语法,其中创建的实际数据实际上是一个1D数组。您可以使用i函数为您提供所需的语义,但数据访问需要在函数内部转换为1D索引。只需将函数设置为如下所示:

int i(int n,int m,int* var1, int maxM) {
  return var1[(maxM * n) + m];
}
这里,var1和var3都是int*类型,大致类似于int[]。您已经创建了一个一维数组,并试图将其作为二维数组访问。将它们的类型更改为int**,分配必要的内存,这将解决您的问题


这里,var1和var3都是int*类型,大致类似于int[]。您已经创建了一个一维数组,并试图将其作为二维数组访问。将其类型更改为int**,分配必要的内存,这将解决您的问题。

也许您正在寻找的是:

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;
}

也许您正在寻找的是:

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;
}

试试看。以下代码在没有警告的情况下编译,并在C99 gcc-std=C99-pedantic-Wall下运行:


首先,注意类型和类型转换,最重要的是,注意它们是如何匹配的。请注意,我在指向数组强制转换的指针中指定数组维度的大小。还要注意,我将var3声明为指向数组的指针,而不是简单的指针

试试看。以下代码在没有警告的情况下编译,并在C99 gcc-std=C99-pedantic-Wall下运行:


首先,注意类型和类型转换,最重要的是,注意它们是如何匹配的。请注意,我在指向数组强制转换的指针中指定数组维度的大小。还要注意,我将var3声明为指向数组的指针,而不是简单的指针

嗨,Amarghosh,我试图实现您的示例,但是我得到了错误消息subscripted value既不是数组也不是指针。也许我误解了你。你能检查一下我对这个问题的修改吗?谢谢@Framester不能在int*上使用[]两次下标。将var3声明为int**并将&var1分配给它,或者只读取var3[0]。你到底想做什么?我想用一个单独的函数来避免迂回。我尝试访问函数示例中的var1,因为它是通过[][]在函数I中访问的。@Framester将指针转换为同一类型的多维数组只在函数调用时起作用-在正常情况下,您不能将指针转换为数组并分配给数组变量。如果你解释为什么你需要二维通道而不是一维通道,也许我们能帮上忙。将var3声明为int**并将&var1分配给它将进行编译,但会对var3[i][j]中大于1的i值进行seg fault嗨,Amarghosh,我尝试实现您的示例,但得到的错误消息是下标值既不是数组也不是指针。也许我误解了你。你能检查一下我对这个问题的修改吗?谢谢@Framester不能在int*上使用[]两次下标。将var3声明为int**并将&var1分配给它,或者只读取var3[0]。你到底想做什么?我想用一个单独的函数来避免迂回。我尝试访问函数示例中的var1,因为它是通过[][]在函数I中访问的。@Framester将指针转换为同一类型的多维数组只在函数调用时起作用-在正常情况下,您不能将指针转换为数组并分配给数组变量。如果你解释为什么你需要二维通道而不是一维通道,也许我们能帮上忙。将var3声明为int**并将&var1分配给它将进行编译,但在var3[i][j]中,如果i的值大于1,则会对错误进行seg,这会混淆语言。。。第一部分仍然有效。嗨,亲爱的,我添加了一个我如何理解你的例子。请参见//notwork III,但我从不兼容的指针ty获得错误消息//assignment
我明白,这里的malloc只创建1D数组。但是为什么我不能在示例函数中以2D数组的形式访问var1,而我可以在I函数中以2D数组的形式访问它呢。困惑我认为答案是你当前的i函数没有真正起作用。您之所以进行此编译,是因为您已经对其进行了适当的铸造,但您是否验证了它确实可以在不崩溃的情况下工作?我很确定这会崩溃。哎呀,把语言搞混了。。。第一部分仍然有效。嗨,亲爱的,我添加了一个我如何理解你的例子。请参见//Not work III,但我从不兼容的指针类型中得到错误消息//assignment我知道,这里的malloc只创建1D数组。但是为什么我不能在示例函数中以2D数组的形式访问var1,而我可以在I函数中以2D数组的形式访问它呢。困惑我认为答案是你当前的i函数没有真正起作用。您之所以进行此编译,是因为您已经对其进行了适当的铸造,但您是否验证了它确实可以在不崩溃的情况下工作?我很确定这会崩溃。谢谢,用这种方式来设置var3 int*var3[10]=int*var1;这是我的解决方案!我想你指的是malloc400,不是malloc100,这取决于你的目标。请参阅以获得一种干净的方法。根据经验,if最好避免不必要的强制转换,除非在MSVC中!。有关无强制转换的解决方案,请参见上一个链接。@Joseph:关于malloc调用-捕获良好。我编辑了代码来解决这个问题,总是那些愚蠢的废话把我绊倒了。关于不必要的强制转换,我对OP的问题的看法是,考虑到他有一个1-D数组,他怎么能像访问2-D数组一样访问它?这就是演员阵容。就我个人而言,我不会这样写代码,但我认为考虑数组类型之间的差异是一个有用的练习;这是我的解决方案!我想你指的是malloc400,不是malloc100,这取决于你的目标。请参阅以获得一种干净的方法。根据经验,if最好避免不必要的强制转换,除非在MSVC中!。有关无强制转换的解决方案,请参见上一个链接。@Joseph:关于malloc调用-捕获良好。我编辑了代码来解决这个问题,总是那些愚蠢的废话把我绊倒了。关于不必要的强制转换,我对OP的问题的看法是,考虑到他有一个1-D数组,他怎么能像访问2-D数组一样访问它?这就是演员阵容。就我个人而言,我不会以这种方式编写代码,但我认为考虑数组类型之间的差异是一个有用的练习。