0

我正在使用系统,从特定键盘读取一些符号,将其传递给 ATmega8,然后将其逐个传递给显示器(此步骤正常工作),但如果我想显示所有符号数组,我发现第一个位置的动态数组保存空,第二个保存空符号,并且正确保存了后续字符。我没有看到代码中有任何错误,所以我需要帮助。

此代码函数必须返回从键盘读取串行符号的 4 元素 char 数组。

char* askPass(void){
     int i;
     char key;          
     #define PS 4
     char* pass = (char*)calloc(PS, sizeof(char));

     clear:
     lcd_clear();
     lcd_gotoxy(0, 0);
     lcd_puts("Enter the password:");  
     lcd_gotoxy(0, 1);               
     lcd_puts(">>");                          
     free(pass);
     pass = (char*)calloc(0, sizeof(char));
     for (i=0;i<PS;i++) pass[i] = ''; 

     for (i=0; i<PS; i++) {
         key = '-';
         key = readKey();
         lcd_gotoxy(3+i, 1);
         if (key == 'C') {
             goto clear;
         } else if (key == '-'){
             lcd_putchar('|');
             delay_ms(10);
             lcd_gotoxy(3+i, 1);
             lcd_putchar(' ');
             delay_ms(10);
             lcd_gotoxy(3+i, 1);
             i--;
         } else {
             pass = (char*)realloc(pass, i*sizeof(char));
             *(pass+i) = key;   
             lcd_putchar(*(pass+i));
             delay_ms(20);
         }            
     }             
     /// there is an error: 
      /// serial input: 1234
      /// lcd output: !* 34! 
      /// correct output: !1234!
     lcd_gotoxy(0,2);
     lcd_puts("!");       
     for (i=0; i<PS; i++) {
         if (!(*(pass+i))) lcd_putchar('*'); 
         else lcd_putchar(*(pass+i));
     }
     lcd_puts("!");                    
     // end error block 

     return pass;
 }  // can't return correct array value

/* 所有测试都表明:

Serial input word: abcd
Output: !* cd!
Correct output: !abcd!

*/

4

1 回答 1

0

您开始分配 4 个字节:

char* pass = (char*)calloc(PS, sizeof(char));

然后你free(pass)甚至在使用分配的数据之前调用,然后分配字节:

pass = (char*)calloc(0, sizeof(char));

如果只分配给 free 而不使用分配,或者分配零字节是没有意义的。分配零字节的行为是未定义的,但尝试写入这样的分配不会发生任何好事或有用的事情。

连续重新分配一次添加一个字节也是不明智的。最好先分配一个合理长度的缓冲区,如果需要扩展,请在块中扩展多个字符。

在任何情况下都不清楚为什么要动态分配和重新分配以允许输入您不使用的任意数量的字符。简单地接受固定长度数组中的四个字符并丢弃任何无关的输入会更简单且更具确定性。

没有“空字符”之类的东西,calloc已经将分配初始化为零(一个空字符)。

我很确定这段代码还有很多其他问题,但它必须确定你想要做什么才能提供建议;你最好使用调试器。

于 2019-04-28T22:21:38.980 回答