我正在尝试从文件中读取整数并将其存储在数组中。然后,我想将这些值写入另一个文件。读取写作是在与创建数组的主文件不同的文件中进行的。我无法更改函数的参数(这是分配的,因此数组参数必须为int ** ppPerm)。该函数在另一个文件的主函数中被调用,并且最初创建了数组。我正在读取的文件如下所示:
15
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
15是多少个数字。因此,功能的时间顺序为:
Array Perm在主文件的主函数中创建(int * Perm = NULL)。它被传递到readP()
readP(In, &Perm);
读取文件中的数字并将其存储在Perm中。然后将相同的变量Perm传递到writeP()。
writeP(Out, Perm, permLength);
Perm被读取并写入另一个文件。 我不能更改任何一条线。沿路的某个地方将阵列弄坏了。这是readP()。
int readP(FILE* In, int** ppPerm) {
int numElements = 0;
fscanf(In, "%d", &numElements);
*ppPerm = (int*)calloc(numElements, sizeof(int));
int i;
for (i = 0; i < numElements; i++) {
fscanf(In, "%p", &ppPerm[i]);
}
return numElements;
}
现在,该数组完全不可读。无论出于何种原因,存储的数字都类似于0x0,然后是十六进制的随机混杂。然后在writeP()中使用该数组将值写入另一个文件:
void writeP(FILE* Out, const int* pPerm, int permLength) {
int i = 2;
for (i = 0; i < permLength; i++) {
fprintf(Out, "%d ", pPerm[i]);
}
return;
}
int * pPerm是传递给readP()的同一数组。出于某种原因,通过调试,我发现pPerm包含的值与ppPerm完全不同,在某些情况下,它似乎是空的。我的功能到底出了什么问题?为什么不能将数字正确存储在数组中?为什么数组在readP()和writeP()之间不断混乱?
答案 0 :(得分:0)
不要在C中强制转换calloc()
或malloc()
的结果!它可以隐藏错误。
int i; for (i = 0; i < numElements; i++) { fscanf(In, "%p", &ppPerm[i]); }
由于要读取整数,因此格式字符串应为"%i"
或"%d"
。要访问指向已分配内存的指针,请使用*ppPerm
:
size_t i; // variables that hold an index into or the size
// of objects in memory should be of type size_t.
for (i = 0; i < numElements; i++) {
fscanf(In, "%p", &(*ppPerm)[i]);
}