【问题标题】:Garbage value coming using arrays in C垃圾值来自使用 C 中的数组
【发布时间】:2014-08-16 20:09:25
【问题描述】:
#include <stdio.h>
int i;
float *calculateProduct(int *,int *,int );
int main()
{

        int n;
        
        printf("Enter length of array\n");
        scanf("%d",&n);
        
        int x[100];
        int y[100];
        for(i=0;i<n;i++)
        {
            scanf("%d",&x[i]);
        }
        for(i=0;i<n;i++)
        {
            scanf("%d",&y[i]);
        }
        
        /*for(i=0;i<n;i++)
        {
            printf("%d ",x[i]);
        }
        printf("\n");
        for(i=0;i<n;i++)
        {
            printf("%d ",y[i]);
        }
        printf("\n");
        */
        int *ptr;
        ptr=calculateProduct( x, y, n);
        for(i=0;i<n;i++)
        printf("%d ",*(ptr+i));
    
        return 0;
}

float *calculateProduct(int *x,int *y,int n)
{
    int z[100];
    for(i=0;i<n;i++)
    {
        z[i]=x[i]*y[i]; 
    }
    
    return z;
}

在上面的代码中,我想将 2 个数组传递给一个函数及其大小,然后想计算这 2 个数组的乘积,全部使用函数和指针。

在我的测试用例中,我取 3 作为数组的大小并输入元素。产品数组正确显示了第一个两个元素的结果,但没有显示第三个元素的结果。但是,在调试并包含一些 printf 语句时,我得到了正确的答案(我在我的代码中对此进行了评论)。

这怎么可能? 2个printf语句怎么能去掉垃圾值?

【问题讨论】:

标签: c arrays function pointers


【解决方案1】:
 int z[100];

是函数 calculateProduct 的本地函数,因此它在返回后将不再可用。

您还返回int 数组,但您的返回类型是float *

应该是

int *calculateProduct(int *x,int *y,int n)

你需要在函数int *calculateProduct(...)中动态分配数组。

喜欢

int *z;
z=(int *) malloc(100*sizeof(int));

【讨论】:

  • 处理数值数组时,使用calloc 分配以确保所有值都归零通常很有用。 z=calloc(100, sizeof(int));
【解决方案2】:

您应该检查来自scanf 的返回值,以确保数组xy 实际被填充。

还可以动态创建数组z 或将其传递给函数。另外你为什么要回float *

我认为最好的选择是

void calculateProduct(int *x,int *y, int *z, int n)
{
    for(i=0;i<n;i++)
    {
        z[i]=x[i]*y[i]; 
    }
}

z 的定义方式与 x 类似

【讨论】:

    猜你喜欢
    • 2013-05-07
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多