C 从函数返回的数组值错误
我正在制作这个程序,其中我的主函数调用一个函数,该函数在计算后返回一个数组。我已经检查了计算是否在局部函数中。但当我将该数组返回到“main”函数时,我只能一次打印正确的值,而它会在其他时间打印错误的值C 从函数返回的数组值错误,c,arrays,C,Arrays,我正在制作这个程序,其中我的主函数调用一个函数,该函数在计算后返回一个数组。我已经检查了计算是否在局部函数中。但当我将该数组返回到“main”函数时,我只能一次打印正确的值,而它会在其他时间打印错误的值 #include <math.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <assert.h> #include <limits.h
#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未定义行为意味着任何事情都可能发生,包括“看起来正常”返回指向局部变量的指针(从数组降级)与返回(的值)不同一个局部变量。后一个是你的答案可能被误读的原因。第一个是问题。我建议重新措辞。问题不在于数组对象超出范围;这只是指其名称可见的区域。问题在于返回的指针指向一个生命周期已结束的对象。Ifop1
其中d定义为static
,返回指向它(或其初始元素)的指针是有效的,即使它仍然超出范围。感谢您的更正@KeithThompson,我已经编写了该变量超出范围,我认为它与生命周期结束时的变量一样。我错了吗?感谢您的善意解释。推荐int*op1=malloc(sizeof*op1*(input1\u size-1))
和insureinput1_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;
}