Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不同数据类型的sizeof(数据类型\指针)/sizeof(数据类型)值不同,为什么?_C++_C_Arrays_Pointers_Sizeof - Fatal编程技术网

C++ 不同数据类型的sizeof(数据类型\指针)/sizeof(数据类型)值不同,为什么?

C++ 不同数据类型的sizeof(数据类型\指针)/sizeof(数据类型)值不同,为什么?,c++,c,arrays,pointers,sizeof,C++,C,Arrays,Pointers,Sizeof,我在C++程序中声明了以下结构: struct person { char name[10]; /* first name */ char id[10]; /* ID number */ off_t pos; /* position in file, for demonstration */ } people[] = { { "arnold", "123456789", 0 },

我在C++程序中声明了以下结构:

    struct person {
        char name[10];      /* first name */
        char id[10];        /* ID number */
        off_t pos;      /* position in file, for demonstration */
    } people[] = {
        { "arnold", "123456789", 0 },
        { "miriam", "987654321", 10240 },
        { "joe",    "192837465", 81920 },
    };

        j = sizeof(people) / sizeof(people[0]);     /* count of elements */
这里给出j=3,即数组中的元素数;始终,即使您添加或减少元素

但是

在我的机器上给出i=a常数=4的值

现在这是合理的,因为sizeofchar*在我的机器上是恒定的,sizeofchar也是恒定的


但是,一旦我声明struct person,sizeofperson*和sizeofperson也应该是常量,并且它还应该产生一个常量值,不是吗???

您的编译器是错误的

char b[8];
i = sizeof(b)/sizeof(b[0]);
应产生i==8

得到的结构大小结果是正确的。如果我是你,我会换编译器

如果你将b传递给一个计算大小的函数,那么你是对的。但是现在的代码是否定的

另外,如果是一个计算sizeofpeople/sizeofpeople[0]的函数,它接收了作为参数的人员,那么您还将得到一个常量


这是因为数组作为参数传递时会衰减为指针。

是否确实要将sizeof应用于数组而不是指针

在这种情况下,函数参数实际上是一个指针,因此您将得到i==sizeofchar*:

您发布的代码应该明确给出数组元素的数量。如果没有,那么您的代码中可能有其他非常奇怪的东西,或者您的编译器彻底崩溃了

  char b[8];          
  i = sizeof(b)/sizeof(b[0]); 

该值应仅为8。sizeofb将给出数组的大小,而不是您认为的sizeofchar*。

我不相信char变量总是给出4。。。在我的机器上是4,我执行了代码。sizeofchar*取决于在我的机器上容纳地址所需的字节数,sizeofchar始终为1,不是吗。所以,它需要4*sizeofchar来容纳我机器上的地址……这篇文章是一个很好的例子,说明了为什么人们应该发布完整的程序而不是代码片段。请发布最短的完整程序来演示您的问题。但是在上面的代码中,你没有一个字符,你有一个字符[8 ]。@ Oli Charlesworth:我的编译器做了一些奇怪的事情,我用微软Visual C++来尝试代码,它工作了…我用微软Visual C++来测试代码,现在它工作了,谢谢!!
void f(char b[8]) {
    i = sizeof(b)/sizeof(b[0]);
}
  char b[8];          
  i = sizeof(b)/sizeof(b[0]);