【问题标题】:Where is the error in this function to print a random array?这个函数打印随机数组的错误在哪里?
【发布时间】:2020-12-24 07:27:04
【问题描述】:

我不明白函数中的错误在哪里。我需要打印 2 个带有随机元素的数组。

int *boo3(int *x , int n){
        x = (int*) malloc(sizeof(int)*n);
        int i;
        for(i=0;i<n;i++){
        x[i] = rand()%10-(rand()%10);;
        printf("%5d ",x[i]);
        }
        printf("\n");
}


int main(int argc, char *argv[])
{
        int *x ,*y;
        int n , m;
        int i,j;
        printf("enter size of X[n]: ");
        scanf("%d",&n);
        printf("enter size of Y[m]: ");
        scanf("%d",&m);
        x=boo3(*x,n);
        y=boo3(*y,m);
        free(x);
        free(y);
        return 0;
}

【问题讨论】:

标签: arrays c function


【解决方案1】:

这段代码有几个问题:

  • x = (int*) malloc(sizeof(int)*n); 覆盖函数参数 x。
  • boo3 中没有返回语句,
  • x=boo3(*x,m) 在这一行中,*x 是取消引用指针 x,它为您提供 int
  • 在主函数中,您试图释放未初始化的指针xy

【讨论】:

    【解决方案2】:

    在您的代码中

    int *boo3(int *x , int n)
    

    这表明你应该从这个函数接收一个返回值。 通常,返回值可以是错误代码或您可能希望继续使用的任何数据。 就像加法的数学函数一样,将操作数作为参数并返回总和。在您的情况下,它是指向您已分配的内存的指针。

    boo3() 函数中,您正在分配一些内存,您需要指向该内存的指针以供进一步使用。 boo3() 不返回任何内容,但是,在 main() 函数中,您假设您已捕获它,因此出现了问题。

    您应该返回指向来自boo3() 的数据的指针。

    我可以在main()函数中看到,

    x=boo3(*x,n);
    

    这令人震惊。您正在取消引用 int* 指针并将 int(而不是 int*)作为参数传递给需要 int*boo3() 函数。

    如果您希望将main() 中声明的指针分配给boo3() 中分配的内存地址,那么您不要抓住它并更改为

    boo3(x, n);
    boo3(y, m);
    

    然后改成

    void boo3(int *x , int n)
    

    但是,理想情况下,函数应该返回并且值作为返回值被捕获。在这种情况下,更改为

    int* boo3(int n)
    

    boo3 的末尾添加return x;。并将其用作

    x = boo3(n);
    

    此外,您没有检查malloc() 是否分配了任何内存。您应该检查指针是否为 NULL 以查看是否分配了内存。这是您需要进行的最小错误检查和处理。其次,malloc() 返回一个void*,所以不需要类型转换。

    【讨论】:

      【解决方案3】:

      问题是,你没有从函数boo3()返回任何东西,并尝试使用返回值。这会导致未定义的行为。

      您需要在函数末尾添加return x;,以便返回保存已分配内存地址(和填充值)的指针。

      也就是说,当您从函数返回指针时,不需要传递指针参数。除了您的调用甚至没有尝试将指针作为第一个参数传递这一事实之外,正如函数签名所预期的那样 - 要将内存分配给来自被调用函数的指针,您无论如何都需要传递指针的地址,传递仅指针是不够的。您不需要这样做,只需将函数定义为

       int *boo3(int n) { //......
      

      最后,添加 返回 x;

      来自main(),这样称呼它

          x=boo3(n);
          y=boo3(m);
      

      【讨论】:

      • 我应该返回什么值才能使程序正常工作?
      【解决方案4】:

      你的代码有很多问题。

      以下内容已更正:

      • boo3 现在只返回指向已分配内存的指针,其中填充了随机数,无用的 x 参数已被删除,函数现在包含缺少的 return 语句。这实际上是您代码中的主要问题。
      • 无意义的(int*) 演员表已从malloc 中删除。
      • 代码格式正确。
      • 变量声明的尽可能接近其作用域。这是惯用的方式,在作用域开头声明所有变量是上个世纪的事情。
      • 使用有意义的变量名。

      这是您程序的正确版本:

      #include <stdlib.h>
      #include <stdio.h>
      
      int* boo3(int n) {
        int *array = malloc(sizeof(int) * n);
      
        for (int i = 0; i < n; i++) {
          array[i] = rand() % 10 - (rand() % 10);;
          printf("%5d ", array[i]);
        }
        printf("\n");
      
        return array;
      }
      
      
      int main(int argc, char* argv[])
      {
        int sizex, sizey;
        printf("enter size of X[n]: ");
        scanf("%d", &sizex);
        printf("enter size of Y[m]: ");
        scanf("%d", &sizey);
        int *xvalues = boo3(sizex);
        int *yvalues = boo3(sizey);
        free(xvalues);
        free(yvalues);
        return 0;
      }
      

      免责声明:为简洁起见,scanfmalloc 没有错误检查。

      【讨论】:

      • 为了树立一个好例子,还要确保array 在索引到它之前不为空,并使用每个scanf() 调用的返回值。通过这些更改,我可能会接受它是“正确的”......
      猜你喜欢
      • 2023-03-17
      • 2013-10-22
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 2013-10-12
      相关资源
      最近更新 更多