相关疑难解决方法(0)

C99是否保证阵列是连续的?

在另一个问题的热门评论主题之后,我开始讨论C99标准中有关C数组的内容和内容.

基本上,当我定义一个2D数组时int a[5][5],标准C99是否保证它将是一个连续的整数块,我可以将它投射到(int *)a并确保我将拥有一个25个整数的有效一维数组.

正如我理解标准的那样,上面的属性隐含在sizeof定义和指针算术中,但其他人似乎不同意并且说铸造到(int*)上面的结构给出了一个未定义的行为(即使他们同意所有现有的实现实际分配连续的价值观).

更具体地说,如果我们认为一种实现可以检测数组检查所有维度的数组边界并在访问1D数组时返回某种错误,或者不能正确访问第1行以上的元素.这样的实施可以是标准的编制吗?在这种情况下,C99标准的哪些部分是相关的.

c arrays pointers c99

17
推荐指数
2
解决办法
4033
查看次数

"container_of"宏可以严格遵守吗?

linux内核(和其他地方)中常用的宏container_of是(基本上)定义如下:

#define container_of(ptr, type, member) (((type) *)((char *)(ptr) - offsetof((type), (member))))
Run Code Online (Sandbox Code Playgroud)

在给定指向其中一个成员的指针的情况下,它基本上允许恢复"父"结构:

struct foo {
    char ch;
    int bar;
};
...
struct foo f = ...
int *ptr = &f.bar; // 'ptr' points to the 'bar' member of 'struct foo' inside 'f'
struct foo *g = container_of(ptr, struct foo, bar);
// now, 'g' should point to 'f', i.e. 'g == &f'
Run Code Online (Sandbox Code Playgroud)

但是,并不完全清楚其中包含的减法是否container_of被视为未定义的行为.

一方面,因为barinside struct foo只是一个整数,所以只*ptr应该是有效的(以及ptr + 1).因此,container_of有效地产生一个表达式 …

c standards pointers

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

标签 统计

c ×2

pointers ×2

arrays ×1

c99 ×1

standards ×1