相关疑难解决方法(0)

获取数组变量的地址意味着什么?

今天我读了一个让我感到困惑的C片段:

#include <stdio.h>

int
main(void)
{
    int a[] = {0, 1, 2, 3};

    printf("%d\n", *(*(&a + 1) - 1));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在我看来,&a + 1毫无意义,但它运行没有错误.

有人可以解释一下这意味着什么,谢谢.K&R C圣经是否涵盖了这一点?

UPDATE0:读完答案后,我意识到这两个表达式主要让我困惑:

  1. &a + 1,在SO中被问到:关于c中的表达"&anArray"

  2. *(&a + 1) -1,这与阵列衰减有关.

c pointers

26
推荐指数
3
解决办法
2783
查看次数

C++数据成员对齐和数组打包

在代码审查期间,我遇到了一些定义简单结构的代码,如下所示:

class foo {
   unsigned char a;
   unsigned char b;
   unsigned char c;
}
Run Code Online (Sandbox Code Playgroud)

在其他地方,定义了这些对象的数组:

foo listOfFoos[SOME_NUM];
Run Code Online (Sandbox Code Playgroud)

之后,将结构原始复制到缓冲区中:

memcpy(pBuff,listOfFoos,3*SOME_NUM);
Run Code Online (Sandbox Code Playgroud)

此代码依赖于以下假设:a.)foo的大小为3,并且不应用填充,并且b.)这些对象的数组被打包,它们之间没有填充.

我已经在两个平台(RedHat 64b,Solaris 9)上使用GNU进行了尝试,并且它在两者上都有效.

以上假设是否有效?如果没有,在什么条件下(例如OS /编译器的变化)可能会失败?

c++ packing bit-packing data-structures

17
推荐指数
4
解决办法
8610
查看次数

数组向量的内存布局是什么?

类型变量是Vec<[f3; 5]>作为一个连续数组(Vec::len() * 5 * sizeof(f32)字节)存储还是存储为Vec指针?

arrays rust

8
推荐指数
1
解决办法
1291
查看次数

C++中的数据对齐,标准和可移植性

我想T通过使用::operator new(size_t)和放置来构造类的对象new.

为了"扩展" char v[1]最后声明的数据成员的大小T,我分配了sizeof(T) + n - 1字节operator new(),其中n是所需的大小(以字节为单位).这一招可以让我访问v[i]任何i[0, n -1].

我的问题是关于C++标准:

  1. 数据成员声明的顺序是否T反映了数据在内存中的表示顺序?

  2. 如果保留订单,无论分配的内存大小有多大,数据成员对齐是否也会保留?

c++

5
推荐指数
1
解决办法
1261
查看次数

C++对齐和数组

  • 我有一些T我明确指定为x -aligned的类型
  • x >sizeof(T)
  • x >任何实现基本对齐
  • (例如:x是页面或缓存对齐)

假设我现在有:T arr[y],其中arrX -aligned(无论是通过被分配在堆栈上,或者在数据,或由X -aligned堆分配)

然后至少有一些arr[1],...,arr[y-1]不是x对齐的.

正确?(事实上​​,如果不随扩展对齐规范改变,它必须是正确的sizeof(T))

注1:这是一样的问题是如何的阵列在C++对准相比包含一个类型?.这个问题询问阵列本身的对齐方式,而不是内部各个元素的对齐方式.

注2:这个问题:alignas会影响sizeof的值吗?基本上就是我要问的 - 但是对于扩展对齐.

注3:https://stackoverflow.com/a/4638295/7226419 这个问题是一个权威的答案(sizeof(T)包括满足对齐要求所需的任何填充,以使所有T的数组T正确对齐.

c c++

0
推荐指数
1
解决办法
804
查看次数

标签 统计

c++ ×3

c ×2

arrays ×1

bit-packing ×1

data-structures ×1

packing ×1

pointers ×1

rust ×1