gpt4 book ai didi

c - 不同环境下程序输出的差异

转载 作者:太空宇宙 更新时间:2023-11-04 02:48:13 26 4
gpt4 key购买 nike

我是编码新手,我正在尝试通过示例问题进行回溯,以打印给定数字集中所有成员总和等于给定值的子集。

我遇到了一个非常奇怪的问题,下面的代码恰好运行良好,并在 ideone.com 等在线编译器上提供了所需的输出,但在我的系统上给出了错误的输出。我可以解释为什么会发生这种情况以及可能的原因吗?

//works well on online compilers

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

void printArray(int *a, int n)
{
int i;
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
return;
}

void subsetSum(int *set, int *tuple, int setSize, int tupleSize, int current, int sum, int const target)
{
if(sum==target)
{
printArray(tuple,tupleSize);
subsetSum(set,tuple,setSize,tupleSize-1,current+1,sum-set[current],target);//call further for items excluding this one
}
else
{
int i;
for(i=current;i<setSize;i++)
{
tuple[tupleSize]=set[i]; //add the ith node to tuple and move down for backtracking
subsetSum(set,tuple,setSize,tupleSize+1,i+1,sum+set[i],target); ///after this backtrack to other possible nodes
}
}
return;
}

void getSubsets(int *set, int size, int const target)
{
int *tuple=(int*)malloc(size*sizeof(int));
subsetSum(set,tuple,size,0,0,0,target);
free(tuple);
return;
}

int main(void)
{
int weights[] = {10, 7, 5, 18, 12, 20, 15};
int size = 7;
getSubsets(weights, size, 32);
return 0;
}

预期输出(在ideone上)

10 7 15 
7 5 20
5 12 15
12 20

电脑输出错误

10 7 15 
10 7
10

7 5 20
5 12 15
5 12
5

12 20

最佳答案

我相信您正在读取 set[] 数组(分配为 tuple[])的末尾,这会导致未定义的行为 (UB)。

  1. 考虑 for 循环中的第一次 i=6 (setsize-1)。
  2. 然后你调用:

    subsetSum(set,tuple,setSize,tupleSize+1, (setsize-1)+1, sum+set[i],target);
  3. 这意味着在对 subsetSum() 的函数调用中,current == setsize

  4. 假设 sum==target 你打印了数组(很好)但是你做了:

    subsetSum(set,tuple,setSize,tupleSize-1, setsize+1, sum-set[setsize],target);

    set[setsize] 调用中溢出。

printArray() 之后删除递归函数调用可以消除缓冲区溢出,因此 UB 和一切都可以正常工作。它最初在一个编译器/环境中“工作”的原因仅仅是由于 UB 的性质......有时它似乎可以正常工作。

关于c - 不同环境下程序输出的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25126514/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com