Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从函数返回的数组值错误_C_Arrays - Fatal编程技术网

C 从函数返回的数组值错误

C 从函数返回的数组值错误,c,arrays,C,Arrays,我正在制作这个程序,其中我的主函数调用一个函数,该函数在计算后返回一个数组。我已经检查了计算是否在局部函数中。但当我将该数组返回到“main”函数时,我只能一次打印正确的值,而它会在其他时间打印错误的值 #include <math.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <assert.h> #include <limits.h

我正在制作这个程序,其中我的主函数调用一个函数,该函数在计算后返回一个数组。我已经检查了计算是否在局部函数中。但当我将该数组返回到“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),之后再打印它给出的垃圾值。

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

op1
仅存在于
getJoinedPipes
中,如果返回它,结果是未定义的行为

要解决此问题,您可以:

  • op1
    作为参数传递给
    getJoinedPiped
  • 在堆上动态分配
    op1
    。如果这样做,您可以安全地返回
    op1
    ,但您必须记住在不需要时释放它

当您试图获取局部变量对象的值->可怕的错误和未定义的行为时,您正在返回指向其生存期已结束的局部变量对象的指针

如果要从函数返回数组,请通过
malloc
动态分配它,并且在使用完该数组后不要忘记
释放它。如果获得了所需的内存,还应检查
malloc
的返回值

正确

#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 = (int *)malloc(sizeof(int) * (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]);

}

free(output);
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int*getJoinedPipes(int-input1\u大小,int*input1,int*output\u大小){
int i,j,温度;
int*op1=(int*)malloc(sizeof(int)*(input1_size-1));
*输出大小=输入1大小-1;

对于(i=0;i您应该检查缩进……除此之外,我想可能会出现问题,因为您在函数中输出的数组是在函数堆栈上创建的。因此,作为输出数组得到的是joinedPipes函数堆栈上的引用。请尝试将数组作为参数传递给函数,而不是作为ret创建瓮值


希望这能起到作用…

可能重复的问题和许多其他类似的问题使用控制台值在您可以发布文本时发布文本图片。好的!我返回的值不是地址
op1
是地址,不是值。它是本地数组
op1
的第一个元素的地址。
op1
一旦退出该函数,它就不再存在。请以最多的赞成票阅读答案,这就是为什么称为未定义行为。@Swanver未定义行为意味着任何事情都可能发生,包括“看起来正常”返回指向局部变量的指针(从数组降级)与返回(的值)不同一个局部变量。后一个是你的答案可能被误读的原因。第一个是问题。我建议重新措辞。问题不在于数组对象超出范围;这只是指其名称可见的区域。问题在于返回的指针指向一个生命周期已结束的对象。If
op1
其中d定义为
static
,返回指向它(或其初始元素)的指针是有效的,即使它仍然超出范围。感谢您的更正@KeithThompson,我已经编写了该变量超出范围,我认为它与生命周期结束时的变量一样。我错了吗?感谢您的善意解释。推荐
int*op1=malloc(sizeof*op1*(input1\u size-1))
和insure
input1_size>2
@FilipKočica:Scope是程序文本中标识符可见的区域。life或storage duration是对象存在的执行时间跨度。参见C标准第6.2节;是最新的公开草案。
a==5    
a==1943372821    
a==1943372821    
1943372821    
17    
6356632
#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 = (int *)malloc(sizeof(int) * (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]);

}

free(output);
return 0;
}