c相关内容

指向数组第一个元素之前的指针

在C语言中,当指针指向同一数组或数组末尾的一个元素时,算术和比较的定义就很好.那么在数组第一个元素之前的那个呢?只要不取消引用就可以吗? 给予 int a [10],* p;p = a; (1)编写-p 是否合法? (2)在表达式中写入 p-1 是否合法? (3)如果(2)可以,我可以断言 p-1 ..
发布时间:2021-05-28 20:18:22 其他开发

var和&(** var)有什么区别

某些源代码使用符号&(* var),其中 var 已经是一个指针,例如 int * var = ... . 这两个符号之间有区别吗? var!=&(* var)吗? 示例: https://github.com/FreeFem/FreeFem-sources/blob/develop/src/medit/inout_popenbinaire.c#L40 解决方案 &(* ..
发布时间:2021-05-28 20:18:20 其他开发

重新声明未加标签的结构是否是兼容类型?

出于此问题中所述的目的,我们要这样做: typedef struct {int a;} 一种;typedef struct {struct {int a;};int b;} B;A * BToA(B * b){return(A *)b;}B * AToB(A * a){返回(B *)a;} 愿望是强制类型转换符合C 2011 6.7.2.1 15 表示“指向经过适当转换的结构对象的指针指向 ..
发布时间:2021-05-28 20:18:17 其他开发

“立即在库函数返回之前"序列点的结果是什么?

在最近的问题中,某些代码显示为具有未定义的行为: a [++ i] = foo(a [i-1],a [i]); 因为即使 foo()的实际 call 是一个序列点,所以赋值是未排序,因此您不知道该函数是在 ++ i 发生副作用之后还是在此之前被调用的. 对此有进一步的考虑,函数调用中的顺序点仅保证在输入函数后执行副作用来评估函数自变量,例如 int y = 1;int func1 ..
发布时间:2021-05-28 20:18:10 其他开发

将C要求应用于未选定的_Generic案例

(请注意,这是一个语言律师问题.) 不建议使用的问题 更新:我对问题0进行了修改.撰写本文时,我正在查看C 2018 6.5.2.2 6中的参数自变量类型规则,这些规则不在“约束"部分中,因此可能被编译器忽略.我忽略了“约束"部分中的6.5.2.2 2,因此需要编译器来诊断不匹配的类型.如果我注意到这一点,我就不会问0. 在此问题中,我们所需的代码,例如: int AddVe ..
发布时间:2021-05-28 20:17:40 其他开发

单个malloc中的多个结构调用未定义的行为?

来自在声明灵活数组成员时使用正确的语法,它表示当 malloc 用于标头和灵活数据时, data [1]] 被入侵到 struct , 当访问其他任何元素时,此示例具有未定义的行为比数据数组的第一个元素.(请参阅C标准,6.5.6.)因此,编译器可以生成不返回代码的代码.访问数据的第二个元素时的期望值. 我查看了C Standard 6.5.6,但看不到它将如何产生不确定的行为.我使用 ..
发布时间:2021-05-28 20:17:34 其他开发

保证`long`与`size_t`一样宽

在寻找 unsigned long 足以容纳 size_t 的证据以作为对 printf 的论据的证据时,我遇到了两个事实(oids. 首先,有一个答案指出, long 的确不能保证足够大 size_t .另一方面,我看到了这个答案,建议使用 printf(“%lu",(无符号长)x)在C99之前的版本中, x 的大小为 size_t . 所以问题是您可以假设还是可以保证 long 足 ..
发布时间:2021-05-28 20:17:18 其他开发

哪种方法可以在乘法时测试有符号整数溢出?

以下哪一项以符合标准的方式进行“正确的事情"?您可以假定 m 和 n 的类型为 int (带符号整数).主要问题是有符号整数溢出. 示例1. size_t字节= n * m;如果(n> 0&& m> 0&& SIZE_MAX/n> = m){/*分配“字节"空间*/} 示例2. if(n> 0&& m> 0&& SIZE_MAX/n> = m){size_t字节= n * m;/ ..
发布时间:2021-05-28 20:17:03 C/C++开发

(a = 0,a)+(a = 1,a)是int a的不确定行为吗?

是 int main(){诠释int b =(a = 0,a)+(a = 1,a);} 定义了吗?在每个术语中都没有,a 的情况下,由于对 a 的多次无顺序写入,程序行为显然是不确定的,但请不要引入,足够的测序点? 解决方案 否,它定义不明确.假设我们用伪代码"SQ"替换您代码中的所有序列点: SQint b =(a = 0 SQ a)+(a = 1 SQ a)SQ 然后我 ..
发布时间:2021-05-28 20:16:38 其他开发

在将指针转换为uintptr_t之前需要转换为void *吗?反之亦然?

C99标准的 7.18.1.4 部分: 以下类型指定了一个无符号整数类型,其属性是可以将指向 void 的任何有效指针转换为该类型,然后再转换回指向的指针 void ,结果将等于原始指针: uintptr_t 这是否意味着只能将 void * 类型转换为 uintptr_t 并返回,而无需更改原始指针的值? 特别是,我想知道是否需要以下代码才能使用 uintptr_t : ..
发布时间:2021-05-28 20:16:35 其他开发

将易失性分配给非易失性语义和C标准

volatile int vfoo = 0;无效func(){诠释吧;做{bar = vfoo;//L.7} while(bar!= 1);返回;} 此代码忙于等待变量变为 1 .如果第一次将 vfoo 设置为 1 ,我会卡在里面吗. 此代码编译时没有警告.标准对此有何说法? vfoo 被声明为 volatile .因此,应不优化对该变量的读取. 但是,酒吧不合格 易失性.是否 ..
发布时间:2021-05-28 20:16:15 其他开发

C中的void类型

在各种不同情况下,C语言中的 void 类型似乎很奇怪.有时它的行为类似于普通的对象类型,例如 int 或 char ,有时它只是没有意义(应该如此). 看看我的片段.首先,您可以声明一个 void 对象似乎很奇怪,这意味着您什么都不声明. 然后我创建了一个 int 变量并将其结果转换为 void 并丢弃: 如果任何其他类型的表达式被评估为void表达式,其值或指示符将被丢弃.( ..
发布时间:2021-05-28 20:16:02 其他开发

C-两个指针之间的转换行为

更新2020-12-11::谢谢@"Some Programme dude".对于评论中的建议.我的根本问题是我们的团队正在实现动态类型的存储引擎.我们为 16对齐分配了多个char数组[PAGE_SIZE]缓冲区,以存储动态类型的数据(没有固定的结构).出于效率原因,我们无法执行字节编码或分配额外的空间来使用 memcpy . 由于确定了对齐方式(即16),剩下的就是使用指针强制转换来访问 ..
发布时间:2021-05-28 20:15:48 其他开发

&的行为其次是*运算符

我对地址运算符后跟取消引用运算符的行为有疑问. 让我们看一下表达式& * p ,其中 p 的类型为 int * . C11标准(第6.5.3.2节)说: 一元&运算符产生其操作数的地址.如果操作数的类型为‘类型’,结果的类型为“指向类型’.如果操作数是一元运算的结果*操作员,那个操作员和&对运算符进行评估,结果就好像两个都除了对运算符的约束仍然适用并且结果不是左值之外,省略了该值 ..
发布时间:2021-05-28 20:15:35 其他开发

编译器降低程序的时间复杂度合法吗?是否认为这是可观察到的行为?

(注意:这旨在成为(例如,编译器可以合法地将多项式时间程序“简化"为指数时间程序吗?) 如果答案在C和C ++或两者的不同版本中有所不同,请说明不同之处. 解决方案 C标准实际上没有时间复杂度模型,无论是其原始操作还是库函数都没有,因此允许编译器执行几乎所有操作保留程序语义(可观察到的行为). C ++标准仅对其某些库函数提供了复杂性保证,并说(17.5.1.4 [struct ..
发布时间:2021-05-28 20:15:29 C/C++开发

C中的临时对象

在C11中,定义了临时寿命: C11 6.2.4p8:具有结构或联合类型的非左值表达式,其中结构或联合包含具有数组类型的成员(递归包括所有包含的结构和联合的成员)是指具有自动存储期限和临时生存期的对象.36)当表达式被求值并且其初始值为表达式的值时,其生命周期开始.当包含完整表达式或完整声明符的求值结束时,其生存期结束.任何试图使用临时生存期修改对象的尝试都会导致未定义的行为. 我想知 ..
发布时间:2021-05-28 20:15:21 其他开发

省略指向结构的指针的前向声明是否有效?

我最近遇到了此评论,作者: @Paul Ogilvie : "您说“要定义指向结构的指针,您只需知道结构标签".根据我的经验,这是不必要的.只需声明一个pointer_to_some_type,编译器将为指针保留空间并在赋值时进行类型检查.仅在您要取消引用指针并访问其成员之后,才必须完全知道该类型." 我尝试过: struct foo {诠释结构条* x;};结构条{int b;} ..
发布时间:2021-05-28 20:14:35 其他开发