【问题标题】:After a pointer Returns from a function i cant print it指针从函数返回后,我无法打印它
【发布时间】:2021-04-27 07:49:21
【问题描述】:

我对 C 比较陌生。我的程序应该用随机数填充数组,我必须使用 1 函数找到最大值和最小值。该程序运行良好,直到我必须返回我的 2 个指针从函数中获得的值。当我去打印它们时,porgram 停止工作并以 3221225477 的返回值退出。我已经尝试修复这个问题 3 个小时,我要疯了。请以任何方式提供帮助,我真的很感激。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void MaxMin(int size, int *B, int *Max, int *Min);

int main(int argc, char *argv[])
{
    int N, i,*A,*MAX,*MIN;
    srand(time(NULL));
    
    
    /*Making sure the user enters a proper value for the array*/
    do
    {
        printf("Give the number of spaces in the Array\n");
        scanf("%d",&N);
    }
    while(N<1);
    
    A = (int *) malloc(N*(sizeof(N)));
    
    
    
    /*Giving random numbers to the array and printing them so i can make sure my code is finding the max min*/
    for(i=0;i<N;i++)
    {
        A[i]=rand()%100;
        printf("\n%d\n",A[i]);
    }
    
    
    
    
    /*Calling my void function so that the pointers MAX and MIN have a value assigned to them */
    MaxMin(N, A, MAX, MIN);
    
    
    /*Printing them*/
    printf("\nMax = %d\nMin = %d",*MAX,*MIN);
    free(A);
    return 0;
}



/*The function*/
void MaxMin(int size, int *B, int *Max, int *Min)
{
    /*using 2 temporary ints to get max min cause pointers and arrays confuse me*/
    int max=B[0],min=B[0],i;
    for(i=1;i<size;i++)
    {
        if(max<B[i])
        {
            max = B[i];
        }
        if(min>B[i])
        {
            min = B[i];
        }
    }
    
    /*These have the proper value last i chekced */
    Max = &max;
    Min = &min;
}

(编辑)解决方案 非常感谢您的帮助!

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void MaxMin(int size, int *B, int *Max, int *Min);

int main(int argc, char *argv[])
{
    int N, i,*A,MAX ,MIN ;
    srand(time(NULL));
    
    
    /*Making sure the user enters a proper value for the array*/
    do
    {
        printf("Give the number of spaces in the Array\n");
        scanf("%d",&N);
    }
    while(N<1);
    
    A = (int *) malloc(N*(sizeof(int)));
    
    
    
    /*Giving random numbers to the array and printing them so i can make sure my code is finding the max min*/
    for(i=0;i<N;i++)
    {
        A[i]=rand()%100;
        printf("\n%d\n",A[i]);
    }
    
    
    
    
    /*Calling my void function so that the pointers MAX and MIN have a value assigned to them */
    MaxMin(N, A, &MAX, &MIN);
    
    
    /*Printing them*/
    printf("\nMax = %d\nMin = %d",MAX,MIN);
    free(A);
    return 0;
}



/*The function*/
void MaxMin(int size, int *B, int *Max, int *Min)
{
    *Max=B[0];
    *Min=B[0];
    int i;
    for(i=1;i<size;i++)
    {
        if(*Max<B[i])
        {
            *Max = B[i];
        }
        if(*Min>B[i])
        {
            *Min = B[i];
        }
    }
}

【问题讨论】:

  • 不相关:在同一范围内拥有变量 Maxmax 是非常糟糕的做法。
  • 注意:使用printf("\nMax = %d\nMin = %d",*MAX,*MIN);,代码不是“当我去打印它们时”,因为代码不会尝试打印指针。相反,*MAX 引用了 MAX 所指向的内容(如果该步骤有效)并打印生成的 int

标签: c crash pass-by-reference pass-by-value function-definition


【解决方案1】:

您通过值传递给函数MaxMin 指针MAXMIN。那就是该函数处理传递的指针的(不确定的)值的副本。更改副本不会影响原始参数。

在 main 中,您应该将 MIN 和 MAX 声明为 int 类型的对象。

int N, i,*A, MAX, MIN;

然后调用函数,就像

MaxMin(N, A, &MAX, &MIN);

在你应该写的函数内

*Max = &max;
*Min = &min;

最后你应该在 main 中调用 printf

printf("\nMax = %d\nMin = %d", MAX, MIN);

注意该语句中使用的表达式sizeof( N )

A = (int *) malloc(N*(sizeof(N)));

容易出错。例如,变量 N 的类型可以从 int 类型更改为 size_t 类型。这种情况下分配的内存大小会不正确,你应该写例子

A = (int *) malloc(N*(sizeof( *A )));

【讨论】:

    【解决方案2】:

    你有三个错误:

    1. main 中,您不分配MAXMIN 任何值。所以你把垃圾传递给MaxMin

    2. MaxMinMaxMin 即将超出范围。在超出范围之前更改它们的值对任何事情都没有影响。

    3. main 中,您不会创建任何位置来保存最大值和最小值。那么您希望它们存储在哪里?

    【讨论】:

      猜你喜欢
      • 2021-03-16
      • 2015-09-19
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 2019-04-01
      • 2011-12-06
      • 1970-01-01
      • 2022-01-07
      相关资源
      最近更新 更多