"Error Segmentation fault (core dumped)" 在 C 中使用数组
"Error Segmentation fault (core dumped)" while working with Arrays in C
我有这段代码,它工作得很好除非我输入的是数字“2”。
不知道为什么,代码好像没问题...
有什么问题吗?
void initValue(int *a, int dim, int value, int i);
int findValue(int *a, int dim, int value, int i);
main(){
int i, value, dim = 5;
int a[dim];
initValue(a, dim, value, i);
printf("\nYour values are: ");
for(i = 0; i < dim; i++) printf("%d ", a[i]);
printf("\n\n");
}
void initValue(int *a, int dim, int value, int i){
printf("Insert your values:\n");
for(i = 0; i < dim; i++){
scanf("%d", &value);
if(findValue(a, dim, value, i) == 1){
printf("This value already exist, please insert a new one.\n");
i--;
}
else a[i] = value;
}
}
int findValue(int *a, int dim, int value, int i){
int j, result = 0;
for(j = 0; j < i || a[j] != value; j++) if(a[j] == value) result = 1;
return result;
}
您必须检查 scanf()
是否成功,例如
if (scanf("%d", &value) != 1)
maybeRemoveAllWhitespacesAndScanfAgain_MaybeReturnWithAnError();
你递减 i
并且从不检查是否 i < 0
for(i = 0; (i < dim) && (i >= 0) ; i++){
initValue()
可以定义为
void initValue(int *a, int dim)
{
int value;
int i;
.
.
.
}
传递来自 main()
的变量没有意义。
还有一件事,如果您在 scanf()
之前初始化 value
,您可以防止在未初始化时尝试访问它。
您的代码中的错误是此行中的逻辑错误:
for(j = 0; j < i || a[j] != value; j++) if(a[j] == value) result = 1;
假设您有 dim=5
和 i=2
以及 value=10
,但没有 a
。循环不会在 j=2
处停止,因为 a[j] != value
为真。之后您将进入未定义的行为领域。
该行需要更改为:
for(j = 0; j < i ; j++) if(a[j] == value) return 1;
函数现在可以简化为:
int findValue(int *a, int dim, int value, int i){
int j = 0;
for(j = 0; j < i ; j++)
{
if(a[j] == value)
{
result = 1;
}
}
return 0;
}
我有这段代码,它工作得很好除非我输入的是数字“2”。
不知道为什么,代码好像没问题... 有什么问题吗?
void initValue(int *a, int dim, int value, int i);
int findValue(int *a, int dim, int value, int i);
main(){
int i, value, dim = 5;
int a[dim];
initValue(a, dim, value, i);
printf("\nYour values are: ");
for(i = 0; i < dim; i++) printf("%d ", a[i]);
printf("\n\n");
}
void initValue(int *a, int dim, int value, int i){
printf("Insert your values:\n");
for(i = 0; i < dim; i++){
scanf("%d", &value);
if(findValue(a, dim, value, i) == 1){
printf("This value already exist, please insert a new one.\n");
i--;
}
else a[i] = value;
}
}
int findValue(int *a, int dim, int value, int i){
int j, result = 0;
for(j = 0; j < i || a[j] != value; j++) if(a[j] == value) result = 1;
return result;
}
您必须检查
scanf()
是否成功,例如if (scanf("%d", &value) != 1) maybeRemoveAllWhitespacesAndScanfAgain_MaybeReturnWithAnError();
你递减
i
并且从不检查是否i < 0
for(i = 0; (i < dim) && (i >= 0) ; i++){
initValue()
可以定义为void initValue(int *a, int dim) { int value; int i; . . . }
传递来自 main()
的变量没有意义。
还有一件事,如果您在 scanf()
之前初始化 value
,您可以防止在未初始化时尝试访问它。
您的代码中的错误是此行中的逻辑错误:
for(j = 0; j < i || a[j] != value; j++) if(a[j] == value) result = 1;
假设您有 dim=5
和 i=2
以及 value=10
,但没有 a
。循环不会在 j=2
处停止,因为 a[j] != value
为真。之后您将进入未定义的行为领域。
该行需要更改为:
for(j = 0; j < i ; j++) if(a[j] == value) return 1;
函数现在可以简化为:
int findValue(int *a, int dim, int value, int i){
int j = 0;
for(j = 0; j < i ; j++)
{
if(a[j] == value)
{
result = 1;
}
}
return 0;
}