c - 为什么采用 sizeof(array) 会在函数中发出警告,但在 main() 中却不会?

标签 c arrays pointers gcc gcc-warning

<分区>

我目前正在编写一些加密算法,但遇到了一个我无法理解的 GCC 编译错误。这是问题所在:

在我的 int main(void) 函数中我得到了:

uint32_t block[2];
memset(block, 0x0, sizeof(block));
printf("%ld \n", sizeof(block));

这对于 GCC 来说看起来没问题。

然后,我将这个名为 block 的 uint32_t 数组传递给一个函数:

void readOneBlockFromFile(int fd, uint32_t block[2]){
  if(fd == -1){
    perror("fd");
    errno = EIO;
    exit(errno);
  }
  int nb_bytes_read = 0;
  while(1){
    memset(block, 0x0, sizeof(block));
    nb_bytes_read = read(fd, block, sizeof(block));
    if(nb_bytes_read == -1){
      perror("read");
      exit(errno);
    }
    if(nb_bytes_read == 0){
      break; //EOF
    }
  }
}

在这里我收到了一些 GCC 警告:

SPN.c: In function ‘readOneBlockFromFile’:
SPN.c:46:30: warning: ‘sizeof’ on array function parameter ‘block’ will return size of ‘uint32_t * {aka unsigned int *}’ [-Wsizeof-array-argument]
     memset(block, 0x0, sizeof(block));
                              ^
SPN.c:38:44: note: declared here
 void readOneBlockFromFile(int fd, uint32_t block[2]){
                                            ^~~~~
SPN.c:47:43: warning: ‘sizeof’ on array function parameter ‘block’ will return size of ‘uint32_t * {aka unsigned int *}’ [-Wsizeof-array-argument]
     nb_bytes_read = read(fd, block, sizeof(block));
                                           ^
SPN.c:38:44: note: declared here
 void readOneBlockFromFile(int fd, uint32_t block[2]){
                                            ^~~~~

因此,当我使用 block 而未使用 block[0]*block 时,我的 GCC 会发出警告。

我不明白为什么 GCC 会为此发出警告,因为我可以在 main 中做同样的事情而不会出现任何问题。

最佳答案

在您的功能标题中

void readOneBlockFromFile(int fd, uint32_t block[2])

您将 block 声明为大小为 2 的数组。但是,在 C 中,数组总是作为指向其第一个元素的指针传递。因此 sizeof 将返回指针的大小,而不是数组的大小。

(本质上,声明您传递的数组的大小有助于编译器检查您的代码,是否传递了正确的参数。在多维数组中,编译器允许您使用 [][]索引。如果不声明传递的数组的大小,那是不可能的。)

您进一步似乎已经知道数组的大小,因此将其传递给 read,例如大小(uint32_t [2])


在我看来,一个更有用的界面是:

int readOneBlockFromFile(int fd, void *block, int size)
{
     int nb_bytes_read = read(fd, block, size);
     //...
     return nb_bytes_read;
}
int example(void)
{
    uint32_t block[2];
    if (readOneBlockFromFile(1,block,sizeof(block))==0) {
        // EOF
    }
}

关于c - 为什么采用 sizeof(array) 会在函数中发出警告,但在 main() 中却不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48770419/

相关文章:

javascript - 从 php 数组中删除逗号

c++ - 在另一个构造函数中调用构造函数(没有要调用的匹配函数......)c++

c++ - shared_ptrs 的 vector 行为神秘

c++ - 指向 void* 的类指针

c - 多维指针数组重新分配导致段错误

不能 dup2 将管道的末端写入标准输出

c - 处理指针数组

C 代码、指针及其内容。考试题

c# - 奇数 : @myRecordArray[0] returns invalid pointer if array size is bigger than 4136

c - 为什么它不打印完整的字符数组?