分段故障(核心转储)添加数组

时间:2014-11-27 18:26:11

标签: c arrays segmentation-fault addition

我正在帮助表弟做一些他的作业。功课是使用数组将两个大数字加在一起,但是我遇到了一个问题。每当我运行程序时,它都会给我“分段错误(核心转储)”错误。这通常是内存问题,但我已尝试用malloc控制结果数组的大小,但没有成功。你能发现我的错误吗?

来源:

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

int main(void)
{
    int i, j, h;

    int a[] = {0, 4, 5, 9, 2, 7, 4, 9, 5, 7, 1, 6, 2, 0, 3, 0};
    int b[] = {0, 2, 7, 8, 4, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    int *result = (int *) malloc(17*sizeof(int));

    for (i = 1; i < sizeof(result); i++) {   
        if (a[i] + b[i] > 9){
            result[i] = a[i] + b[i] - 10;
            result[i-1] += 1;
        }
        else{
            result[i] = a[i] + b[i];
        }

        for (j = 0; h < sizeof(result); j++) {
            if (result[j] > 9){
                result[j] -= 10;
                result[j-1] += 1;
            }   
        }
    }

    printf("Result: ");
    for (h = 0; h < sizeof(result); h++) {
        printf("%d", result[h]);
    }
}

2 个答案:

答案 0 :(得分:1)

在这个循环中

for (j = 0; h < sizeof(result); j++) {

您使用未初始化的变量h。因此循环可以是无限的,因为在这种情况下的程序行为是未定义的。 考虑到sizeof( int * )与示例sizeof( int[17] )不同,通常sizeof( int * )等于4或8.结果的类型为int *;)

但无论如何你的代码都错了。你应该重新设计程序的逻辑。

答案 1 :(得分:0)

首先,我建议从最低位到最高位 - 这样可以避免O(n ^ 2)的复杂性。

问题是内部循环中的sizeof(result):sizeof返回结果数组占用的字节数,而不是元素数。