将指针指向函数传递,返回int和地址(通过参数)

时间:2014-10-28 19:35:10

标签: c arrays pointers

我有一个正常工作的功能。但是程序的其余部分有一个限制,即我已经预设了数组的大小(要分配的空间)。显然,如果出现需要为该阵列提供额外空间的事件,这是有问题的。所以我想在我的程序中添加动态内存分配。

但是我对指针概念的整个指针存在问题,而且我完全没有找到对我有意义的在线解释...... 我想我会想要使用malloc(iRead + 1)来获得正确大小的数组,但我不确定应该将哪些内容分配给... *数组? **阵列?我不太确定。

我也不清楚我的while循环。 & array [iRead]将不再起作用,并且我不确定当指针涉及指针时如何获取数组中的元素。

任何人都可以指出(heh指针双关语)我正确的方向吗?

4 个答案:

答案 0 :(得分:2)

我可以想到以下方法。

  1. 第一种方法

    1. 在文件中进行两次传递。
    2. 在第一遍中,读取数字并丢弃它们,但继续计算项目数。
    3. 为所有项目分配一次内存。
    4. 倒回文件并再次通过它。在第二遍中,读取并存储数字。

      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);
      }
      
  2. 第二种方法。

    1. 继续阅读文件中的数字。
    2. 每次阅读号码时,请使用realloc为附加项目分配空间。
    3. 将其存储在重新分配的内存中。

      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)

您需要做什么:

  1. 找出你需要多少内存,例如。有多少元素
  2. *array = malloc(numElements * sizeof(int))分配它(在数组分配内存的地址读取“numElements整数”)
  3. 现在你可以(*array)[idx] = some int(读取“在数组指向的地址,获取带索引idx的元素并为其指定一些int”)
  4. 使用int* destination; int size = read(&destination, "asdf", hexi)
  5. 进行调用 希望它有所帮助..