【问题标题】:Sizeof returning incorrect array length [duplicate]Sizeof 返回不正确的数组长度 [重复]
【发布时间】:2012-10-16 09:49:46
【问题描述】:

可能重复:
Sizeof an array in the C programming language?

我一直在摆弄 C 以便更好地熟悉它,并认为我可能偶然发现了一个我不确定如何解决的初始化/指针问题。下面的程序是 ROT13 的一个实现,所以它接受一个输入字符串,并将每个字母移动 13,得到密文。我的程序的输出显示了正确的班次,但它不能用于超过 4 个字符,这让我想知道 sizeof 是否使用不正确。任何其他建议表示赞赏,我确定我在这一点上搞砸了一些事情。

#include <stdio.h>
#include <string.h>

void encrypt(char *);

int main(void){

    char input[] = "fascs";
    encrypt(input);

    return 0;
}

void encrypt(char *input){

    char alphabet[] = "abcdefghijklmnopqrstuvwxyz";

    printf("Input: %s \n", input);

    int inputCount = sizeof(input);

    printf("Characters in Input: %i \n\n", inputCount);

    //holds encrypted text
    char encryptedOutput[inputCount];

    //Initialize counters
    int i, j = 0;

    // loop through alphabet array, if input=current letter, shift 13 mod(26),
    // push result to output array, encryptedOutput
    for(i = 0; i < inputCount; i++){
        for(j = 0; j < 26; j++){
            if(input[i] == alphabet[j]){
                encryptedOutput[i] = alphabet[(j + 13) % 26];
            }
        }
    }

    //Nul Termination for printing purposes
    encryptedOutput[i] = '\0';

    printf("Rot 13: %s \n\n", encryptedOutput);

}

【问题讨论】:

  • 你应该做 sizeof(individualtype)*length of array
  • sizeof 不是运行时函数/运算符。 sizeof(input) 不会在某处调用代码,也不会生成任何代码。它只是在编译时生成一个常量值。你不能用它来找出变量输入指向多少个值。

标签: c arrays pointers sizeof rot13


【解决方案1】:

encrypt 中的sizeof() 不会像您希望的那样运行。在encrypt 内部,sizeof(char *)4(在 32 位机器上)或8(在 64 位机器上),可以看到是指针的大小。

要获得sizeof(input),您必须将sizeof 更改为strlen。因此解决方案 = strlen(input)

为什么会这样??当您将数组传递给函数时,该数组在内部表示为指针。在被调用函数的末尾input只是 一个指针,它根据您的机器给出48 字节大小。

要获得inputsizeof,只需使用如下宏: #define SIZEOF(x) (sizeof(x)/sizeof(x[0])) 并在定义 x 的函数中使用它。在您的程序中,xmain() 中是input

【讨论】:

  • 啊,我应该更仔细地阅读文档。我必须研究整个定义和缓冲业务,我在练习中还没有达到那个点。谢谢!
【解决方案2】:

sizeof 返回其参数类型的大小。它无法确定指向字符数组的指针中有多少个字符。

如果您知道您的字符串是空终止的,您应该考虑使用strlen 函数。

【讨论】:

    【解决方案3】:

    input 的类型为char*(读作“指向字符的指针”)。 sizeof(input) 为您提供指针的大小。您可能想使用strlen 来查找字符串的长度,或者将长度作为附加参数传递给函数。

    【讨论】:

      【解决方案4】:

      这条线会导致你的问题。

      int inputCount = sizeof(input);
      

      sizeof 在这种情况下仅确定变量的大小char *。在 32 位系统上,每个指针的大小为 4 个字节。

      您无法在运行时确定数组的大小。你也可以 * 将输入的大小作为参数传递 * 因为在您的情况下它是一个字符串,如果字符串以\0 终止,请使用string.h 中的strlen 来获取字符串的长度。

      但在这两种情况下,您都不能简单地使用分配输出缓冲区

      char output[variable_containing_size];
      

      您需要使用malloc() 在运行时动态分配内存,或者更容易将输出参数作为参数传递给您的函数。

      #include <stdio.h>
      #include <string.h>
      
      #define BUFFER_LENGTH 80
      
      void encrypt(const char * input, char *output);
      
      int main(void){
      
          char input[BUFFER_LENGTH] = "fascs";
          char output[BUFFER_LENGTH] = {0}; // initialize every field with \0
          encrypt(input, output);
      
          return 0;
      }
      void encrypt(const char *input, char *output){
      
          char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
      
          printf("Input: %s \n", input);
      
          int inputCount = strlen(input);
      
          printf("Characters in Input: %i \n\n", inputCount);
      
          //Initialize counters
          int i, j = 0;
      
          // loop through alphabet array, if input=current letter, shift 13 mod(26),
          // push result to output array, output
          for(i = 0; i < inputCount; i++){
              for(j = 0; j < 26; j++){
                  if(input[i] == alphabet[j]){
                      output[i] = alphabet[(j + 13) % 26];
                  }
              }
          }
      
          //Nul Termination for printing purposes
          output[i] = '\0';
      
          printf("Rot 13: %s \n\n", output);
      
      }
      

      但在这种情况下,encrypt() 函数根本不检查大小,如果你不小心,这很容易导致缓冲区溢出。

      【讨论】:

      • 这很有道理,感谢您的解释。不幸的是,我还没有深入研究缓冲区(至少在不知情的情况下),所以我不清楚它在这个解决方案中的目的。我将不得不更多地研究它。
      猜你喜欢
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      相关资源
      最近更新 更多