代码一直运行,直到它到达语句:
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;
}
如果我犯了任何愚蠢的错误,请责备。
答案 0 :(得分:3)
不是printf()
崩溃。它是sumOccur()
。你的数组中没有\0
值,所以你的while()永远不会终止,你最终会在一个接近无限的循环中运行并运行数组的末尾。
数组是一个数字数组,而不是一个字符串,所以没有任何理由认为值会有一个空终止符。 null终止符用于字符串,而不是数字数组。
答案 1 :(得分:3)
在你的函数int sumOccur
中,你有两个问题 -
1。 sum
和i
未初始化刚刚声明。将两者初始化为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;
}