我有一个正常工作的功能。但是程序的其余部分有一个限制,即我已经预设了数组的大小(要分配的空间)。显然,如果出现需要为该阵列提供额外空间的事件,这是有问题的。所以我想在我的程序中添加动态内存分配。
但是我对指针概念的整个指针存在问题,而且我完全没有找到对我有意义的在线解释...... 我想我会想要使用malloc(iRead + 1)来获得正确大小的数组,但我不确定应该将哪些内容分配给... *数组? **阵列?我不太确定。
我也不清楚我的while循环。 & array [iRead]将不再起作用,并且我不确定当指针涉及指针时如何获取数组中的元素。
任何人都可以指出(heh指针双关语)我正确的方向吗?
答案 0 :(得分:2)
我可以想到以下方法。
第一种方法
倒回文件并再次通过它。在第二遍中,读取并存储数字。
int getNumberOfItems(FILE* fp, int hexi)
{
int numItems = 0;
int number;
char const* format = (hexi == 0) ? "%X" : "%d";
while (fscanf(fp, format, &number) > 0) {
++numItems;
return numItems;
}
void read(int *array, FILE* fp, int numItems, int hexi)
{
int i = 0;
char const* format = (hexi == 0) ? "%X" : "%d";
for ( i = 0; i < numItems; ++i )
fscanf(fp, format, &array[i]);
}
int main(int argc, char** argv)
{
int hexi = 0;
FILE* fp = fopen(argv[1], "r");
// if ( fp == NULL )
// Add error checking code
// Get the number of items in the file.
int numItems = getNumberOfItems(fp, hexi);
// Allocate memory for the items.
int* array = malloc(sizeof(int)*numItems);
// Rewind the file before reading the data
frewind(fp);
// Read the data.
read(array, fp, numItems, hexi);
// Use the data
// ...
// ...
// Dealloate memory
free(array);
}
第二种方法。
realloc
为附加项目分配空间。将其存储在重新分配的内存中。
int read(int **array, char* fpin, int hexi)
{
int number;
int iRead = 0;
// Local variable for ease of use.
int* arr = NULL;
char const* format = (hexi == 0) ? "%X" : "%d";
FILE *fp = fopen(fpin, "r");
if (NULL == fp){
printf("File open error!\n");
exit(-1);
}
while (fscanf(fp, format, &number) > 0) {
arr = realloc(arr, sizeof(int)*(iRead+1));
arr[iRead] = number;
iRead += 1;
}
fclose(fp);
// Return the array in the output argument.
*array = arr;
return iRead;
}
int main(int argc, char** argv)
{
int hexi = 0;
int* array = NULL;
// Read the data.
int numItems = read(&array, argv[1], hexi);
// Use the data
// ...
// ...
// Dealloate memory
free(array);
}
答案 1 :(得分:1)
我建议这样的事情:
int read(int **array_pp, char* fpin, int hexi) {
...
int *array = malloc (sizeof (int) * n);
for (int i=0; i < n; i++)
fscanf(fp, "%X",&array[i]);
...
*array_pp = array;
return n;
}
注意:
1)如果要在函数参数
中返回指针,则必须使用“**”2)但是,如果您愿意,可以声明两个指针变量(array_pp和array)以简化代码。
答案 2 :(得分:1)
int read(int **array, char* fpin, int hexi) {
int iRead = 0;
int i, *ary;
char *para;
FILE *fp;
fp = fopen(fpin, "r");
if (NULL == fp){
printf("File open error!\n");
exit(-1);
}
para = (hexi == 0) ? "%*X" : "%*d";
while (fscanf(fp, para)!= EOF)
++iRead;
ary = *array = malloc(iRead*sizeof(int));
if(ary == NULL){
printf("malloc error!\n");
exit(-2);
}
rewind(fp);
para = (hexi == 0) ? "%X" : "%d";
for(i = 0; i < iRead; ++i)
fscanf(fp, para, &ary[i]);
fclose(fp);
return iRead;
}
答案 3 :(得分:0)
我认为你不会把它称为数组。数组具有固定的大小并位于堆栈上。您需要的(如您所说),是在堆上动态分配内存。
也许这就是为什么你没找到多少:) 这里有一些教程:
你正确地得到了函数声明:
int read(int **array, char* fpin, int hexi)
您需要做什么:
*array = malloc(numElements * sizeof(int))
分配它(在数组分配内存的地址读取“numElements整数”)(*array)[idx] = some int
(读取“在数组指向的地址,获取带索引idx的元素并为其指定一些int”)int* destination; int size = read(&destination, "asdf", hexi)