【问题标题】:C: passing an array (pointer) to a functionC:将数组(指针)传递给函数
【发布时间】:2013-07-30 16:28:47
【问题描述】:

我有一个函数我想要一个函数来接收二维数组 (H)、读取指定列 (col) 并将其传递给另一个数组 (b)。 如果我期望打印 1,下面的代码似乎不行。 非常感谢任何指导。

#define nline 5
#define ncol 4

#include <string.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

void count0(int **M,int col, int *a);

void main(){

    int i;     
    int **H;

    H=(int**)malloc(nline*sizeof(int*));
    for(i=0;i<nline;i++){
        H[i]=(int*)malloc(ncol*sizeof(int));
    }

    H[0][0]=8;
    H[0][1]=5;
    H[0][2]=6;
    H[0][3]=0;
    H[1][0]=7;
    H[1][1]=5;
    H[1][2]=4;
    H[1][3]=0;
    H[2][0]=5;
    H[2][1]=1;
    H[2][2]=1;
    H[2][3]=7;
    H[3][0]=0;
    H[3][1]=0;
    H[3][2]=0;
    H[3][3]=2;
    H[4][0]=1;
    H[4][1]=0;
    H[4][2]=1;
    H[4][3]=4;

    int *b;

    int col=1;

    count0(H,col,&b); 

    printf("num 0=%d\n",b[2]); getchar();

}

/////////////////////////////////////////////////////////////////////////////////

void count0(int **M,int col, int *a){

    int i;

    a=(int*)malloc(1*sizeof(int));

    for(i=0;i<nline;i++){
        a[i]=M[i][col];
        a=realloc(a,(i+2)*sizeof(int));
    }
}

【问题讨论】:

  • 旁注:type *var = malloc(size * sizeof(*var)); 不那么冗长,你不要重复type 三遍。
  • void count0(int **M,int col, int *a){ 应该是 void count0(int **M,int col, int **a){
  • 在 C 中,您不会将 void * 转换为其他指针类型。

标签: c arrays pointers reference


【解决方案1】:

您对输出b 的论证是错误的。它需要是一个指向指针的指针(就像你传递它的方式一样)。现在你应该得到一个关于它的编译器警告。函数原型应该是

void count0(int **M,int col, int **a);

那么在函数中需要使用解引用操作符来访问a

*a = malloc(1*sizeof(int));

请注意,我不会转换malloc的返回值,没有必要,你也不应该。

【讨论】:

  • 谢谢!如果不是一维数组而是二维数组?需要在函数参数 int*** a? 中定义三重指针?
  • @user16720 这完全取决于你如何声明传递给函数的变量,但如果你像Hcount0 中的M 参数)那样做,那么可以。跨度>
【解决方案2】:

正如您已经知道 count0 函数中矩阵中的行数 = nline。所以你应该简单地为数组a在count函数中分配所有内存,你不需要重新调用realloc()函数。

void count0(int **M, int col, int** a){
   (*a) = malloc(nline * sizeof(int));
   for(i = 0; i < nline; i++){ 
      (*a)[i] = M[i][col];
   }
}

注意:[] 的优先级高于*,因此您需要在*a 附近使用()

只需将此函数称为:count0(H, col, &amp;b);

free(b); 在 printf 语句之后的 main() 中显式释放内存。

【讨论】:

【解决方案3】:

您正在尝试使用此变量:

int * b;

在这个调用之后指向一个新分配的数组:

count0(H,col,&b); 

为此,您必须将计数 0 的签名更改为以下内容:

void count0(int **M,int col, int **a);

注意 int *a 现在是 int **a。然后在 count0 的主体中,必须使用以下几行来分配/重新分配 a:

*a=(int*)malloc(1*sizeof(int));
*a=realloc(a,(i+2)*sizeof(int));

现在,a 是一个指针变量,只存在于count0 的范围内。最初它的值是&amp;b(现在没有意义,因为&amp;bint**,而aint*)。您有 a 指向新分配的内存,该内存在函数后丢失。我建议的更改将有*a,因此b,指向可以在函数调用后检索的内存。

【讨论】:

  • 谢谢!如果不是一维数组而是二维数组?需要在函数参数 int*** a? 中定义三重指针?
  • 这取决于你想做什么!如果您想为这个二维数组的“行”分配空间,就像您之前对H=(int**)malloc(nline*sizeof(int*)); 所做的那样,那么可以。你会通过int *** a,然后调用&amp;a = (int**)malloc(nline*sizeof(int*));。假设您已经这样做了,并且您想分配“列”,就像您在程序中使用 H[i]=(int*)malloc(ncol*sizeof(int)); 所做的那样,您仍然可以通过 int ** a 并简单地调用 a[i] = (int*)malloc(ncol*sizeof(int)); 。那是因为a[i] 已经为 int 指针引用了空间。
猜你喜欢
  • 1970-01-01
  • 2017-08-09
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多