好的,
所以我被困在这里。我有一个程序的代码,系统地执行基于算法的人站在一个圆圈,但我有一个问题,它在发布模式崩溃。如果我使用调试器(codeblocks)运行它,我的代码运行正常,但如果我不运行它会崩溃。我在网上四处看看,我发现的唯一的东西是未初始化的变量,但我试着在声明时立即为我的变量设置值,但它没有解决问题。
如果有人能看到我的问题,我将非常感谢您的帮助。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
// if the program does not work, please run in debugger mode. It will work.
void remove_person(int** array, int arraySize, int position)
{
int i;
for (i = 0; i < arraySize; ++i)
printf("%d ", (*array)[i]);
printf("\n");
int* temp = malloc((arraySize - 1) * sizeof(int)); // create temporary array smaller by one element
memmove(temp,*array,(position+1)*sizeof(int)); // copy entire array before position
memmove(temp+position,(*array)+(position+1),(arraySize - position)*sizeof(int)); // copy entire array after postion
for (i = 0; i < arraySize - 1; ++i)
printf("%d ", (temp)[i]);
printf("\n");
free (*array);
*array = temp;
}
int kill(int** a, int n)
{
int pos = 0;
int round = 1;
while(n > 1)
{
pos = pos + 2 - (round % 2);
while(pos >= n)
pos = pos - n;
remove_person(a,n,pos);
n--;
while(pos >= n)
pos = pos - n;
round++;
}
return *a[0];
}
void main()
{
int n, survivor, i;
int* people;
printf("Enter number of people for Russian Roulette: \n");
scanf("%d", &n);
people = (int*) malloc(n*sizeof(int));
for(i=0; i < n; i++)
{
people[i] = i;
}
survivor = kill(&people, n);
printf("The survivor is person #%d\n", survivor);
}
答案 0 :(得分:6)
标题问题的基本答案(“为什么某些C程序在调试中工作但在发布中不起作用?”)是“当它们调用未定义的行为时”。
在这里,
memmove(temp,*array,(position+1)*sizeof(int)); // copy entire array before position
memmove(temp+position,(*array)+(position+1),(arraySize - position)*sizeof(int)); // copy entire array after postion
你复制得太多了。要了解原因,请观看第一个memmove
副本到temp[0]
,temp[1]
,...,temp[position]
,第二个副本到temp[position]
,{{ 1}},...,temp[position+1]
(请注意temp[position+arraySize-position-1] = temp[arraySize-1]
处的重叠)。但是temp[position]
只有temp
个元素的空间 - 你复制了一个比允许持有的元素多一个,所以你得到未定义的行为。
它可能在调试但不是释放模式下工作,因为堆的布局不同(调试模式分配器可以在调试器或分析器下运行时用额外的空间填充分配以捕获这样的错误)。
答案 1 :(得分:0)
如果我输入4(或甚至高于4的数字)作为输入,程序会出现段错误,但我不会进入代码,看看为什么会发生这种情况。
除了程序运行正常之外,问题是您没有看到输出,因为我认为您在Windows上运行它。
尽管如此,你应该在最后添加scanf("%d", &n);
或运行cmd.exe
之类的东西,转到保存可执行文件的目录并从那里运行它。