0

我在使用指针时遇到问题。我知道我应该去上班时间,但我迫切需要帮助。现在最大的问题是试图调试这个程序。据我了解,我应该在我的 void 函数中声明一个地址。之后,我必须将 & 用于 readfile(%testarray)。我究竟做错了什么?我的程序的目标是读取一个数字文件并将它们存储在一个数组中。然后,我将打印数组中的所有数字。任何帮助将不胜感激。

sort.c:11:3: warning: passing argument 1 of 'read_file' makes pointer from integer without a cast [enabled by default]
sort.c:3:6: note: expected 'int **' but argument is of type 'int'
sort.c: In function 'read_file':
sort.c:27:3: warning: format '%d' expects argument of type 'int *', but argument 3 has type 'int' [-Wformat]

代码:

    #include <stdio.h>
    #include <stdlib.h>
    void read_file(int* myList[]);

    int main()
    {
      int testarray[20];
      read_file(&testarray[20]);
      return 0;
    }

    void read_file(int* myList[])
    {
      FILE* inFile;
      int i;
      inFile = fopen("data.txt","r");
      if (inFile == NULL)
      {
        printf("Unable to open file");
        exit(1);
      }
        i = 0;
        while (fscanf(inFile,"%d", *myList[i]) != EOF)
      {
        printf("%d ", *myList[i]);
        i = i+1;
      }
      printf("\n");
      printf("%d\n", i );
     } //void
4

5 回答 5

1

当您[]在函数头中的名称后使用方括号时,您告诉编译器您正在传递一个数组。

  • int testarray[]表示整数数组
  • int *testarray[]表示整数指针数组

由于您传递了一个整数数组,因此函数签名应该是

void read_file(int myList[]);

或其等价物

void read_file(int *myList);

调用应如下所示:

read_file(testarray);

接下来,关于&vs.的主题*:&符号从具有地址的值表达式中生成指针,而星号从指针表达式中生成值。scanf需要一个指针,所以你需要调用它

fscanf(inFile,"%d", &myList[i])

或同等的

fscanf(inFile,"%d", myList+i)
于 2013-02-13T12:16:49.950 回答
0

这是您的固定代码。

#include <stdio.h>
#include <stdlib.h>


void read_file(int myList[20]);

int main()
{
    int testarray[20];
    read_file(testarray);
    return 0;
}

void read_file(int myList[20])
{
    FILE* inFile;
    int i;
    inFile = fopen("data.txt","r");
    if (inFile == NULL)
    {
        printf("Unable to open file");
        exit(1);
    }
    i = 0;
    while (fscanf(inFile,"%d", &myList[i]) != EOF)
    {
        printf("%d ", myList[i]);
        i = i+1;
    }
    printf("\n");
    printf("%d\n", i );
} 
于 2013-02-13T12:14:23.707 回答
0

假设文本文件中有 10 个数字,请参考以下代码:

    #include <stdio.h>
    #include <stdlib.h>
    void read_file(int *);

    int main()
    {
     int *List=(int *)malloc(10*sizeof(int));// Allocate memory for 10 integers
     read_file(List); 
     return 0;
    }

/* Passing a pointer to the contiguous locations, just the starting location is enough*/
    void read_file(int *ptr)
    {
     FILE *inFile;
     inFile=fopen("Numbers.txt","r");
     int i=0;
     if(inFile!=NULL)
      while(fscanf(inFile,"%d",ptr)!=EOF)
      {    
       printf("%d ",*(ptr));
       i++;
      }
      free(ptr);// Free the memory Locations
     } 
于 2013-02-13T12:53:15.753 回答
0

你应该使用:

read_file(&testarray);

当您尝试将指针传递给整个数组时。您所做的只是获取数组中第 20 个元素的地址(顺便说一句,它超出了范围)。

于 2013-02-13T12:11:03.957 回答
0

表达式&testarray[20]是指向数组中最后一个条目之外的一个指针(即与 相同int *),它与指向数组的指针不同。此外,您现在将参数声明为指针数组,而不是指向数组的指针。int *arr[](和之间的差异int (*arr)[])。

此外,您不需要将指向数组的指针传递给函数,而只需让函数具有普通数组(或指针)参数,并按原样传递数组:

void read_file(int myList[]);

int main(void)
{
    int testarray[20];
    read_file(testarray);
    /* .... */
}

在使用数组时,read_file您不需要取消引用运算符。*您可以将其用作普通数组。

于 2013-02-13T12:12:20.363 回答