整数指针缓冲区跳过索引

时间:2015-11-27 18:04:04

标签: c pointers integer buffer lldb

这很奇怪。

我有一个整数指针的缓冲区。我接受一个输入,并将其附加到缓冲区。只是,当我调试时,我看到它在每个输入之间放置了一个0。

  int *buf[BUFLEN];
  char input[BUFLEN];
  int temp;
  printf("To move to the next step, enter q or quit\n");
  printf("Please enter an integer then press Enter to insert integer into the list:\n");
  while(1){
    scanf("%s", input);
    if (!strcmp(input, "q") || !strcmp(input, "quit"))
      break;
    buf[list_count] = atoi(input);
    list_count++;
  }

这是lldb向我展示的内容

(lldb) p *(int(*)[20])buf
(int [20]) $19 = {
  [0] = 9
  [1] = 0
  [2] = 8
  [3] = 0
  [4] = 7
  [5] = 0
  [6] = 6
  [7] = 0
  [8] = 5
  [9] = 0
  [10] = 4
  [11] = 0
  [12] = 3
  [13] = 0
  [14] = 2
  [15] = 0

这很奇怪,因为当我执行p buf时,它是正确的 - 但我的整体程序不起作用,所以我认为我的错误就在这里

(lldb) p buf
(int *[256]) $17 = {
  [0] = 0x0000000000000009
  [1] = 0x0000000000000008
  [2] = 0x0000000000000007
  [3] = 0x0000000000000006
  [4] = 0x0000000000000005
  [5] = 0x0000000000000004
  [6] = 0x0000000000000003
  [7] = 0x0000000000000002
  [8] = 0x0000000000000001

另外,如何将atoi()返回的整数分配给整数指针数组?

就是说,我有......

int *buf[BUFLEN];
scanf("%s", input);
buf[list_count] = atoi(input);

2 个答案:

答案 0 :(得分:2)

您感到困惑intint*。我猜想你的系统sizeof(int) == 4sizeof(int*) == 8

这意味着你的缓冲区看起来像这样:

0x00000000 0x00000009
0x00000000 0x00000008
0x00000000 0x00000007
0x00000000 0x00000006

如果您将它们打印为int*,这将是四个条目,但如果您将它们打印为int,则它将为8,每秒都为零。

  

另外,如何将atoi()返回的整数分配给整数指针数组?

我不确定你要做什么..你是不是想从用户那里读一个指针(即地址)?在那种情况下,你做得很好,只需要演员,所以:

buf[list_count] = (int*)atoi(input);

编译器应该在那里给你一个警告。不要忽视这些。

如果您正在尝试获取用户提供给您的int的地址,那么这种方式并不完全正常。首先,您需要将int存储在单独的int intbuffer[BUFSIZE];中,然后使用该元素的地址。

答案 1 :(得分:0)

关于您发布的代码(此处显示注释)

  int *buf[BUFLEN];   // array of pointers to integers
  char input[BUFLEN]; // array of characters
  int temp;           // unused variable

  printf("To move to the next step, enter q or quit\n");
  printf("Please enter an integer then press Enter to insert integer into the list:\n");

  while(1)
  {
    scanf("%s", input);   // inputs unlimited number of characters
                          //     (ended by use pressing enter)
                          // fails to check returned value (not parameter value)
                          //     to assure op was successful)

    if (!strcmp(input, "q") || !strcmp(input, "quit")) 
      break;

    buf[list_count] = atoi(input); // tries to convert input from char string to integer
                                   // and place result into some pointer
                                   // which raises compiler warning
    list_count++;                  // undefined variable
  }

有几个问题:

  1. 在声明buf[]时声明一个指向整数的指针数组而不是一个整数数组,要声明一个整数数组,请使用int buf[BUFLEN];
  2. scanf()的调用未能限制用户可以输入的字符数。这允许用户超出input[]缓冲区,导致未定义的行为,这可能导致seg故障事件
  3. scanf()的调用无法检查返回的值以确保操作成功
  4. scanf()的每次其他调用失败,因为没有规定从输入流中使用<newline>。 (并且scanf()在遇到任何white space时停止输入字符(例如用户点击'enter'键产生的空白区域)
  5. 评论列出了已发布代码中的其他一些问题。

    建议代码更像以下内容:

      int  buf[BUFLEN];   // array of integers
      char input[BUFLEN]; // array of characters   
    
      printf("To move to the next step, enter q or quit\n");
      printf("Please enter an integer then press Enter to insert integer into the list:\n");
    
      // note limiting the number of inputs so do not overrun `buf[]`
      for( int list_count=0; list_count < BUFLEN; list_count++ )
      {    
           // note checking returned value
           // note leading space in format string to consume white space
           // note limiting number of char that user can input
           if( 1 != (scanf("% *s", BUFLEN-1, input) ) )
           {
                perror( "scanf failed" );
                exit( EXIT_FAILURE );
           }
    
           // implied else, scanf successful
    
           if (!strcmp(input, "q") || !strcmp(input, "quit")) 
               break;
    
           buf[list_count] = atoi(input);
      } // end for