1

我有以下来源:

/*file a2ptr.c */ 
#include <stdio.h>
#include <stddef.h>
typedef struct m_St m_St;
struct m_St
{
    size_t idx;
    size_t m_data[8];
}*x;

size_t GetSize(m_St *s)
{
    s->idx=1;
    return (sizeof((s->idx ? x : s)->m_data));
}
int main(void)
{
    m_St s = { 0 };
    printf("GetSize() returns: %zu\n", GetSize(&s));
    return 0;
}

在使用 GCC 4.8.1 的 32 位 Linux 上,此代码产生以下输出:

$ gcc -Wall -Werror a2ptr.c  
$ ./a.out  
GetSize() returns: 32

我的问题:
(s->idx ? x : s)->m_dataC 中的有效表达式吗?
为什么 GetSize() 返回整个数组的大小(以字节为单位)而不是指向其第一个元素的指针的大小(例如,sizeof(size_t))?

4

4 回答 4

3

(s->idx ? x : s)->m_dataC 中的有效表达式吗?

是的。

为什么GetSize()返回整个数组的大小(以字节为单位)而不是指向其第一个元素的指针的大小(例如,sizeof(size_t))?

读:

6.5.3.4 The sizeof operator, 1125:

当您将 sizeof 运算符应用于数组类型时,结果是数组中的总字节数。

根据 this when sizeof应用于静态数组标识符的名称(不是通过 malloc 分配的),结果是整个数组的大小(以字节为单位),而不仅仅是地址。这是数组名称被转换/衰减为指向数组第一个元素的指针的规则的少数例外之一,这可能只是因为实际数组大小在编译时是固定的并且已知的,当sizeof运算符评估。所以'数组名'没有转换成指针。

要查找数组读取的长度:在 C 中打印数组时的奇怪行为?

另请阅读:

1118运算符不得应用于具有函数类型或
完整类型 的表达式、此类类型的括号名称或指定位域成员的表达式。sizeof

1119
运算符产生 其sizeof操作数的大小(以字节为单位),它可以是表达式或类型的括号名称。

于 2013-09-23T05:31:33.643 回答
2

使用 sizeof 表达式时数组转换为指针?

不。


现在在评论中看到您的问题:

来自 ISO C99 标准:§6.5.3.4 sizeof 运算符 88) 当应用于声明为数组或函数类型的参数时,sizeof 运算符产生调整后的(指针)类型的大小。这句话适用于我的例子吗?我错过了什么?

你错过了这个词parameter。这基本上只是另一种说法,即不能真正将数组传递给函数,只能传递指针,因为数组在传递给函数时总是衰减为指针。您引用的条款涉及以下情况:

void foo(char arr[1000])
{
    // will print sizeof(char *), because in a function argument context,
    // (and ONLY there), T array[N] is the same as T *arrray
    printf("%zu\n", sizeof(arr));
}

现在,如果您的数组是......,好吧,一个真正的数组,而不是一个伪装的指针,那么如果它是运算符的参数,它就不会sizeof衰减为指针。

于 2013-09-23T05:27:11.063 回答
0
size_t m_data[8];
return sizeof(m_data);   // <-- in this case same as return (sizeof(size_t) * 8);

所以如果你想返回元素的数量,你应该这样做:

size_t m_data[8];
return ( sizeof(m_data) / sizeof(size_t) );

“使用 sizeof 表达式时,数组转换为指针?” 没有。您的困惑可能是基于某种称为数组衰减的东西,当数组被转换(衰减)为指针并且使用检索数组长度的能力sizeof丢失时:

size_t getSize(size_t* myDecayedArray) {
    return sizeof(myDecayedArray);     // <-- same as return ( sizeof(size_t*) );
}
...
size_t m_data[8];
return getSize(m_data);                       // <-- array decayed into pointer

请参阅什么是数组衰减?

于 2013-09-23T05:35:36.460 回答
-1

sizeof在编译时计算 - 不是运行时。

于 2013-09-23T05:34:26.640 回答