首页 > 解决方案 > 函数调用后输出不同的值?

问题描述

我对函数check()调用后不同的sizeof()返回值感到困惑。并且buf与基于每个字符的printf()的缓冲区完全相同。任何回复都很棒!谢谢。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void check(char *buf)
{

    printf("%d \n", sizeof(buf)); // **output 8**

}
int main(int argc, char *argv[])
{

    char buffer[] = "\x64\x49\x00\x55\x33\x33\x33\x64\x49\x00\x00\x00\x55\x33\x33\x33\x64\x49\x00\x00\x00\x55\x33\x33\x64\x49\x00\x00\x00\x55\x33\x33";
    printf("%d\n", sizeof(buffer)); // **output 33**
    check(buffer);

}

标签: carrayspointerschar

解决方案


在函数check缓冲区中是一个指针char,它的大小是 8

main功能缓冲区中是 33 个元素的 char 数组,其大小为 33

要获取 C 字符串的长度,请使用strlen函数。

通常没有办法获得指针所引用的数组的大小。您需要将大小作为另一个参数传递。

在您的示例中:

void check(char *buf, size_t size)
{

    printf("%zu \n", size);

}
int main(int argc, char *argv[])
{

    char buffer[] = "\x64\x49\x00\x55\x33\x33\x33\x64\x49\x00\x00\x00\x55\x33\x33\x33\x64\x49\x00\x00\x00\x55\x33\x33\x64\x49\x00\x00\x00\x55\x33\x33";
    printf("%d\n", sizeof(buffer)); // **output 33**
    check(buffer, sizeof(buffer));

}

推荐阅读