2013-07-04 34 views
6

有两个关于代码的问题贴在下面:

        1)当我在代码块运行此代码,该代码有时运行成功(返回0),但通常会导致它显示所有结果后返回一个错误(返回-1073741819)。为什么会这样?

          2)除数组的最后一个元素值为1(pTriangle [20] = 1)外,其他值都正确。但是,我最终得到了一些垃圾数,我做错了什么?

我已经意识到我可以用二项式系数得出相同的结果,但我仍然不知道为什么我会得到这个错误,如果我的错误可以找到,这将是最好的。

Update1
pTriangle[i] = temp[i % 2 ? 0 : 1] + pTriangle[i];似乎是问题所在。当我评论这段代码时,程序没有崩溃。我试图找出为什么崩溃,并试图找到一个解决方案围绕它:)创建帕斯卡三角(不稳定的代码)

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

#define LEVEL 20 

int main() 
{ 
    int *pTriangle = (int*)malloc(sizeof(int)*(LEVEL+1)); 
    int i; 

    for (i = 0; i < LEVEL; i++) 
     pTriangle[i] = 0; 

    createPascalTriangle(pTriangle, LEVEL); 

    for(i = 0; i < LEVEL+1; i++) 
     printf("pTriangle[%d]: %d\n", i, pTriangle[i]); 

    free(pTriangle); 

    return 0; 
} 

int createPascalTriangle(int *pTriangle, int level){ 
    if (level <= 0) 
     return 0; 
    pTriangle[0] = 1; 
    pTriangle[1] = 1; 
    int i; 
    for (i = 2; i <= level; i++) 
     increasePascalTriangleOneLevel(pTriangle); 

    return 1; 
} 

int increasePascalTriangleOneLevel(int *pTriangle){ 
    int i = 1; 
    int temp[2] = {0}; 

    temp[0] = pTriangle[0]; 
    while (pTriangle[i] != 0){ 
     temp[i % 2] = pTriangle[i]; 
     pTriangle[i] = temp[i % 2 ? 0 : 1] + pTriangle[i]; 
     i++; 
    } 
    pTriangle[i] = 1; 

    return 1; 
} 
+0

哇。它缩进了! – 2013-07-04 20:16:31

+0

啊哈。谢谢:) – kpark

回答

1

数组的最后一个元素尚未初始化。

写:

for (i = 0; i < LEVEL + 1; i++) 
    pTriangle[i] = 0; 

代替:

for (i = 0; i < LEVEL; i++) 
     pTriangle[i] = 0; 
+0

顺便说一句,这段代码不符合标准。 (例如,Visual Studio不编译它。)在使用它之前声明你的函数。 – szedjani

+1

我认为就是这样。它对我来说工作得很好,但是valgrind在'while(pTriangle [i]!= 0)'(索引20)时发出了访问未初始化内存的警告。 – Macattack

+0

在许多情况下,它没有任何初始化,它是0,但你不能确定它。 – szedjani