将值分配给C中的单独数组后,数组的第0个值发生变化



我正在读取文件

(标记为in1的文件内容(:

8
0 2 1 4 2 2 3 1
3 2 5 4 6 7 9 2 8  

它通过命令行传递给我的程序。

(这是最低工作版本(:

/*
*Run using make with accompanying Makefile using file in1 as input on command line
*
* */
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char* argv[]){
if(argc != 2){
fprintf(stderr,
"Error: Improper amount of command line arguments. Need one input file.n");
exit(EXIT_FAILURE);
}
FILE* fp = fopen(argv[1], "r");
int n;
int* A = calloc(n+1, sizeof(int));
int* idx = calloc(n, sizeof(int));
fscanf(fp, "%d", &n); //assigns n from file
printf("N is equal to : %dn", n);
for(int i = 0; i < n; i++){ //assigns operations from file
fscanf(fp, "%d", &idx[i]);
}
for(int i = 0; i < n; i++){
printf("idx[%d] = %dn", i, idx[i]);
}
for(int i = 0; i <= n; i++){//set operands
fscanf(fp, "%d", &A[i]);
}
for(int i = 0; i <= n; i++){
printf("A[%d] = %dn", i, A[i]);
}
for(int i = 0; i < n; i++){
printf("idx[%d] = %dn", i, idx[i]);
}
}

这个最小版本仍然产生相同的结果。这就是输出:

N is equal to : 8
idx[0] = 0
idx[1] = 2
idx[2] = 1
idx[3] = 4
idx[4] = 2
idx[5] = 2
idx[6] = 3
idx[7] = 1
A[0] = 3
A[1] = 2
A[2] = 5
A[3] = 4
A[4] = 6
A[5] = 7
A[6] = 9
A[7] = 2
A[8] = 8
idx[0] = 8
idx[1] = 2
idx[2] = 1
idx[3] = 4
idx[4] = 2
idx[5] = 2
idx[6] = 3
idx[7] = 1

看看idx[0]是如何首先等于0,然后在指定A之后,值为8的?

为什么会这样?

(生成文件以运行程序(:

PROGRAM_NAME = minRecreate
FLAGS        = -std=c99 -Wall
SOURCE       = $(PROGRAM_NAME).c
OBJECT       = $(PROGRAM_NAME).o
EXEBIN       = $(PROGRAM_NAME)
$(EXEBIN) : $(OBJECT)
gcc -o $(EXEBIN) $(OBJECT)
$(OBJECT) : $(SOURCE)
gcc -c $(FLAGS) $(SOURCE)
clean :
rm $(EXEBIN) $(OBJECT)
memcheck : $(EXEBIN)
valgrind --leak-check=full $(EXEBIN) in1

第一次使用n时,它未初始化。程序的其余部分会导致未定义的行为,但最有可能的情况是A不够大,所以它最终会重创idx

最新更新