代码在printf语句中崩溃

时间:2015-10-05 15:21:25

标签: c

代码一直运行,直到它到达语句:

printf("%d", sumOccur(input));

代码:

#include <stdio.h>
#include <stdlib.h>
int sumOccur(int A[]);

int main(){
    int input[6] = {1,1,1,2,2,3};
    printf("%d", sumOccur(input));
    return 0;
}

int sumOccur(int A[]) {
int sum, i;
  while(A[i]!='\0'){
    sum += A[i];
    i++;
  }
  return sum;
}

如果我犯了任何愚蠢的错误,请责备。

5 个答案:

答案 0 :(得分:3)

不是printf()崩溃。它是sumOccur()。你的数组中没有\0值,所以你的while()永远不会终止,你最终会在一个接近无限的循环中运行并运行数组的末尾。

数组是一个数字数组,而不是一个字符串,所以没有任何理由认为值会有一个空终止符。 null终止符用于字符串,而不是数字数组。

答案 1 :(得分:3)

在你的函数int sumOccur中,你有两个问题 -

1。 sumi 未初始化刚刚声明。将两者初始化为0

2。同样while(A[i]!='\0')按预期工作,因为您的数组中没有该值。

答案 2 :(得分:0)

您的代码调用未定义的行为:您在A[6]中访问sumOccur和后续不存在的条目,试图在数组中找到最终的0,但是您没有在input函数中的main

如果你对血腥实施细节不感兴趣--------

数组在堆栈上分配,非常接近顶部,因为它在main函数中实例化。阅读超越结束,直到您发现0可能尝试读取超出堆栈页面的末尾并导致分段错误。

答案 3 :(得分:0)

您正在A[i] != '\0'进行迭代,但数组中没有'\0',并且您永远不会初始化sum,这不太可能导致崩溃,但可能是。{/ p >

您需要传递数组中的元素数量,例如

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

int sumOccur(size_t count, const int *A);
int sumOccurCHQrlieWay(const int *A, size_t count);

int main()
{
    int input[] = {1, 1, 1, 2, 2, 3};
    printf("%d", sumOccur(sizeof(input) / sizeof(*input), input));
    return 0;
}

int sumOccur(size_t count, const int *A) 
{
    int sum;
    sum = 0;
    for (size_t i = 0 ; i < count ; ++i)
        sum += A[i];
    return sum;
}

int sumOccurCHQrlieWay(const int *A, size_t count)
{
    return sumOccur(count, A);
}

答案 4 :(得分:0)

请注意,您正在处理一个int数组,这意味着它通常不会包含&#39; \ 0&#39;要迭代数组,你需要指定元素的数量。这是正确的方法:

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

int sumOccur(int A[],size_t number_of_elemets);

int main(){

    int input[6] = {1,1,1,2,2,3};

    //Get the number of elements
    size_t n = sizeof(input) / sizeof(int);

    printf("%d", sumOccur(input,n));

    return 0;
}

int sumOccur(int A[],size_t number_of_elements) {

    int sum = 0;

    size_t i = 0;

    while( i < number_of_elements )
    {
        sum += A[i];
        i++;
    }
    return sum;
}