从函数返回的数组值错误

时间:2017-08-10 15:13:19

标签: c arrays

我正在编写这个程序,其中我的main函数调用一个函数,该函数在计算后返回一个数组。我已经检查过计算是否在本地函数内部。但是,当我将该数组返回给主要的'功能然后我只能打印一次正确的值,并且其他时间打印错误的值。

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>
int* getJoinedPipes(int input1_size, int* input1,int* output_size){
  int i,j,temp;
  int op1[input1_size-1];
  *output_size = input1_size - 1;
  for(i=0; i<input1_size; i++){
    for(j=i+1; j<input1_size; j++){
      if(input1[i] > input1[j]){
        temp     = input1[i];
        input1[i] = input1[j];
        input1[j] = temp;
      }
    }
  }

  op1[0]=input1[0] + input1[1];
  for(i=1;i<input1_size-1;i++){
    op1[i] = op1[i-1]+input1[i+1];
  }
  //printf("%d\n",op1[2]);

  return op1; 
}

int main() {
  int output_size;
  int* output;

  int ip1_size = 0;
  int ip1_i;
  scanf("%d\n", &ip1_size);
  int ip1[ip1_size];
  for(ip1_i = 0; ip1_i < ip1_size; ip1_i++) {
    int ip1_item;
    scanf("%d", &ip1_item);

    ip1[ip1_i] = ip1_item;
  }
  output = getJoinedPipes(ip1_size,ip1,&output_size);
  printf("a==%d\n",output[0]);
  printf("a==%d\n",output[0]);
  printf("a==%d\n",output[0]);
  int output_i;
  for(output_i=0; output_i < output_size; output_i++) {
    printf("%d\n", output[output_i]);
  }

  return 0;
}

输出应为

5
9
15

但是在控制台中,它显示以下内容(干运行后)。 See the image

a==5    
a==1943372821    
a==1943372821    
1943372821    
17    
6356632

你可以看到它第一次给出正确的值(5)以及稍后的同一个打印给它的垃圾值。

3 个答案:

答案 0 :(得分:5)

op1是一个自动数组。您不能将其退回并在其范围之外使用它。

op1仅存在于getJoinedPipes内,如果您将其返回,则结果为未定义的行为

要解决此问题,您可以:

  • op1作为参数传递给getJoinedPiped
  • 动态地在堆上分配op1。你这样做,你可以安全地返回op1,但是当你不需要时,你必须记得free

答案 1 :(得分:3)

当您尝试获取其值时,您正在返回指向其生命周期已结束的局部变量对象的指针 - &gt;可怕的错误和未定义的行为。

如果要从函数返回数组,请通过.as-console-wrapper { max-height: 100% !important; top: 0; }动态分配,并且在完成该数组后不要忘记malloc。如果你有记忆要求,你也应该检查free的返回值。

<强>正确

malloc

答案 2 :(得分:-2)

你应该检查你的缩进...除此之外,我想问题可能会出现,因为你在函数中输出的数组是在函数堆栈上创建的。所以你作为输出数组获得的是joinPipes函数堆栈的引用。尝试将数组作为参数传递给函数,而不是将其创建为返回值。

希望能有这个诀窍......