相关疑难解决方法(0)

为什么 sizeof(x)++ 编译?

我遇到了以下代码片段:

int a = 3;
printf("%d", sizeof(a)++);
Run Code Online (Sandbox Code Playgroud)

显然,这将使用 GCC 9.3.0 和 -std=c99 进行编译。虽然这不编译:

printf("%d", sizeof(3)++);
Run Code Online (Sandbox Code Playgroud)

GCC 打印错误

错误:左值需要作为增量操作数

在我编译第一个片段之前,我会预料到会出现这样的错误。

后缀 ++ 运算符的操作数应为 C99 标准的左值

后缀递增或递减运算符的操作数应具有限定或非限定的实数或指针类型,并且应为可修改的左值。

关于 sizeof Operator 的返回值(如预期):

sizeof 运算符产生其操作数的大小(以字节为单位),它可以是表达式或类型的括号名称。大小由操作数的类型决定。结果是一个整数。如果操作数的类型是变长数组类型,则对操作数求值;否则,不计算操作数并且结果是整数常量。

结果的值是实现定义的,其类型(无符号整数类型)是 size_t,定义在(和其他头文件)中。

sizeof(a)++编译怎么可能?这是未定义的行为还是我错过了什么?

c c99

44
推荐指数
1
解决办法
618
查看次数

sizeof有两个论点

在C++ IS的C.1.3(2003.它也在C++ 11 IS中),该标准指出了ISO C和C++之间的差异; 即,为

char arr[100];
Run Code Online (Sandbox Code Playgroud)

sizeof(0, arr)以C语言返回sizeof(char*),但100在C++中.

我找不到sizeof两个参数的文档.明显的后备是逗号运算符,但我不这么认为:sizeof(arr)在C中100; sizeof(0, arr)sizeof(char*).两个sizeof(0, arr)sizeof(arr)100在C++中.

在这种情况下,我可能会忽略IS的重点.有人可以帮忙吗?这类似于09年讨论的问题,但没有人提到IS,我认为没有给出正确的答案.


编辑:实际上,IS正在谈论逗号运算符.因此,出于某种原因,在C中(0, arr)返回a char*,但char[100]在C++中返回a .为什么?

c c++ arrays pointers comma-operator

37
推荐指数
5
解决办法
2333
查看次数

是"sizeof new int;" 未定义的行为?

码:

#include<iostream>

using namespace std;

int main() 
{
    size_t i = sizeof new int;

    cout<<i;
}
Run Code Online (Sandbox Code Playgroud)

在GCC编译器中,工作正常,没有任何警告或错误和打印输出8.

但是,在clang编译器中,我收到了以下警告:

warning: expression with side effects has no effect in an unevaluated context [-Wunevaluated-expression]
    size_t i = sizeof new int;
Run Code Online (Sandbox Code Playgroud)
  • 哪一个是真的?
  • sizeof new int;未定义的行为?

c++ g++ sizeof c++11 clang++

32
推荐指数
2
解决办法
4103
查看次数

在sizeof(++ n)表达式中不调用Increment运算符

在C或C++中,当运算符在运算符中时,不执行递增和递减运算符(++n,--n)sizeof().

int n = 100;
int size_int = sizeof(++n);
std::cout<<n;
Run Code Online (Sandbox Code Playgroud)

我编写了这段代码并运行程序.当然,我认为101将会为我展示.但是,n不是101,它是100.

这是为什么?

c c++ increment sizeof

31
推荐指数
4
解决办法
1845
查看次数

为什么这个C代码可以正常运行?

C代码喜欢这个:

 #include <stdio.h>
 #include <unistd.h> 
 #define DIM(a) (sizeof(a)/sizeof(a[0])) 
 struct obj
 {
     int a[1];
 };
 int main()
 {
     struct obj *p = NULL;
     printf("%d\n",DIM(p->a));
     return 0;
 }
Run Code Online (Sandbox Code Playgroud)

这个对象指针pNULL,所以,我认为这p->a是非法的.但是我已经在Ubuntu14.04中测试了这段代码,它可以正确执行.所以,我想知道为什么......


注意:原始代码在int a[0]上面,但我已经改变了,int a[1]因为每个人似乎都挂在那而不是实际的问题,这是:

sizeof(p->a)当表达式p等于时,表达式是否有效NULL

c

24
推荐指数
3
解决办法
2092
查看次数

取消引用空指针在sizeof操作中是否有效

我遇到了一段代码片段,对我来说应该会因为分段错误而崩溃,但它可以毫无障碍地工作.有问题的代码加上相关的数据结构如下(在上面找到相关的评论):

typedef struct {
  double length;
  unsigned char nPlaced;
  unsigned char path[0];
}


RouteDefinition* Alloc_RouteDefinition()
{
  // NB: The +nBags*sizeof.. trick "expands" the path[0] array in RouteDefinition
  // to the path[nBags] array
  RouteDefinition *def = NULL;
  return (RouteDefinition*) malloc(sizeof(RouteDefinition) + nBags * sizeof(def->path[0]));
}
Run Code Online (Sandbox Code Playgroud)

为什么这样做?我收集了的sizeof字符*将解决对给定的体系结构指针的大小,但它不应该和好如初,同时取消引用NULL终场?

c sizeof null-pointer dereference

21
推荐指数
2
解决办法
4528
查看次数

"int size = 10;" 产生一个恒定的表达?

以下代码在gcc 4.8和Clang 3.2下编译:

int main()
{
  int size = 10;
  int arr[size];
}
Run Code Online (Sandbox Code Playgroud)

C++标准的8.3.4/1表示数组的大小必须是一个整数常量表达式,这size似乎不是.这是两个编译器中的错误,还是我错过了什么?

最新的VC++ CTP用这个有趣的消息拒绝代码:

error C2466: cannot allocate an array of constant size 0
Run Code Online (Sandbox Code Playgroud)

有趣的是,它似乎认为size是零.但至少它拒绝了代码.gcc和Clang应该不一样吗?

c++ arrays compile-time-constant variable-length-array c++11

13
推荐指数
1
解决办法
1209
查看次数

具有可变长度数组类型的Sizeof运算符

根据cppreference:

如果表达式的类型是可变长度数组类型, 则计算表达式,并在运行时计算它计算的数组的大小.

这意味着:如果表达式的类型是VLA类型,则计算表达式.例如:

#include <stdio.h>

int main() {
    int i = 0;
    int a[i];
    printf("%zu\n",sizeof(a[i++]));
    printf("%d\n",i); // Here, print 0 instead of 1
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以,根据参考,这里i变成了1.但是,使用我的GCC编译器,i打印为0.

请参阅Wandbox演示.

c gcc sizeof variable-length-array

13
推荐指数
2
解决办法
1208
查看次数

增量运算符不使用sizeof

可能重复:
为什么sizeof(x ++)不能递增x?

只是想知道为什么增量运算符不能在下面的代码片段中工作:

    int main()
    {
        int a = 10;
        int b = sizeof(a++);
        cout<<"a: "<<a<<endl;
        cout<<"b: "<<b<<endl;
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

输出 -

a:10

b:4

c++ operators sizeof

8
推荐指数
2
解决办法
622
查看次数

为什么sizeof(x ++)不会增加变量x值

#include <stdio.h>
void main()
{
    int x = 99;
    int y = sizeof(x++);
    printf("x is %d", x);
}
Run Code Online (Sandbox Code Playgroud)

以上程序的结果是:

x是99

为什么?任何人都可以告诉为什么sizeof运算符x不会增加.

c sizeof

6
推荐指数
0
解决办法
186
查看次数