Tag: 铸造

转换错误:左值作为赋值的左操作数需要左值

所以我试图使用ether_aton()返回一个struct ether_addr * 。 我试图把它放在我的struct ether_header *eptr (来自net / ethernet.h)中,它有ether_shost成员。 我试过这个: struct ether_header *eptr; /* net/ethernet.h */ … (struct ether_addr*)(eptr->ether_shost) = ether_aton(SRC_ETHER_ADDR); 这给了我”Error: lvalue required as left operand of assignment” 我知道我只是没有正确地投射,但无法弄清楚如何。 编辑:结束了它。 谢谢你的帮助。 struct ether_addr* eth_addr = ether_aton(SRC_ETHER_ADDR); int i; for(i=0; iether_shost[i] = eth_addr->ether_addr_octet[i]; 只需要分别分配每个八位字节。

为什么这个演员的结果不是左值?

我需要一些关于这种奇怪行为的建议 – 让我们有这样的代码: int ** p; 这编译没有任何麻烦: p++; 但是这个: ((int**)p)++; 给我这个错误消息: “error: lvalue required as increment operand” 。 我正在将它转换为它已经存在的类型,没有任何变化,那么问题是什么? 当我尝试编译一个旧版本的gdb时,这是我遇到的问题的简化版本。 所以我想,这样做有所改变。 知道第二个例子有什么问题吗?

将非`void`指针转换为`uintptr_t`,反之亦然

有两个相关的C标准规则: C99标准, 6.3.2.3 : 指向void的指针可以转换为指向任何不完整或对象类型的指针。 指向任何不完整或对象类型的指针可能会转换为指向void的指针并再次返回; 结果应该等于原始指针。 并且7.20.1.4 : 下面的类型指定一个无符号整数类型,其属性是任何有效的void指针都可以转换为此类型,然后转换回指向void的指针,结果将与原始指针进行比较: uintptr_t 这意味着,以下代码符合: int *p = NULL; void *q = (void*)p; uintptr_t s = (uintptr_t)q; 但它真的需要两步演员吗? 如果执行以下操作,编译器是否会执行隐式中间转换: int *p = NULL; uintptr_t s = (uintptr_t)p; (好吧,它可能会出现在大多数编译器上,但我的问题是标准符合性)

将指向整数的指针强制转换为指向char的指针时会发生什么?

int i=40; char *p; p=(char *)&i;//What actually happens here? printf(“%d”,*p); 什么是输出? 请帮忙!

应用按位运算符“〜”后,从“int”转换为“unsigned short”

我使用的静态分析工具会引发对此代码的警告: uint16 var1 = 1U; uint16 var2 = ~var1; 我检查了MISRA C 2004规则,我发现10.5规则: 如果按位运算符〜和<<应用于基础类型unsigned char或unsigned short的操作数od,则结果应立即转换为操作数的基础类型。 好吧,这不是问题,应用隐式强制转换(我认为“强制转换”意味着隐式或显式强制转换)。 但10.1规则说: 整数类型的表达式的值不应隐式转换为表达式复杂的不同基础类型。 先前的复杂操作示例是:~u16a 我将我的代码更改为: uint16 var1 = 1U; uint16 var2 = (uint16) ~var1; 我得到另一个警告:我认为将int负值转换为unsigned int值是不安全的。 我检查了C99标准( ISO C99 )§6.3.1.3但我不明白是否明确指定了int转换为unsigned short 。 在EmbeddedGurus文章中我读到: c = (unsigned int) a; /* Since a is positive, this cast is safe */ 我的问题: 是否有从signed […]

是否可以将结构转换为另一个?

任何人都可以描述(struct sockaddr *)&server如何在这里工作? 是否有可能将更大的结构转换为更小的结构? 看到这些结构: // IPv4 AF_INET sockets: struct sockaddr_in { short sin_family; // eg AF_INET, AF_INET6 unsigned short sin_port; // eg htons(3490) struct in_addr sin_addr; // see struct in_addr, below char sin_zero[8]; // zero this if you want to }; struct in_addr { unsigned long s_addr; // load with inet_pton() }; struct sockaddr […]

在C中的printf()中将int类型化为char

int *int_pointer = malloc(10); *int_pointer = 53200; printf(“The integer at byte #0 is set to: %d \n”, (char) *int_pointer); 结果:-48 所以我只是试着看看会发生什么,我得到了这个意想不到的结果。 为什么-48? 怎么会变成负面的?

int到char cast

int i = 259; /* 03010000 in Little Endian ; 00000103 in Big Endian */ char c = (char)i; /* returns 03 in both Little and Big Endian?? */ 在我的计算机中它将03分配给char c并且我有Little Endian,但我不知道char转换是读取最低有效字节还是读取i变量指向的字节。

需要对C中的铸造进行一些澄清

我刚刚读到了关于转换malloc返回值的不良做法。 如果我理解正确,那么离开演员是绝对合法的,因为它是隐含的(并且应该留下,因为它可能产生其他问题)。 那么我的问题是,我什么时候应该施展我的价值观? 有一些一般规则或什么? 例如,此代码使用gcc -W -Wall编译时没有任何错误(除了未使用的bar ,但这不是重点): float foo(void) { double bar = 4.2; return bar; } int main(void) { double bar = foo(); return 0; } 我现在很困惑。 有关铸造的良好做法和规则是什么? 谢谢。

在C中,如果我对一个指针进行转换和取消引用,那么我先做哪一个是否重要?

在C中,您可以将int , float和指针等简单数据类型转换为这些数据类型。 现在我假设如果你想从一个类型的指针转​​换为另一个类型的值(例如从*float到int ),则转换和解除引用的顺序无关紧要。 也就是说,对于变量float* pf ,你有(int) *pf == *((int*) pf) 。 有点像数学中的交换性…… 然而,情况似乎并非如此。 我写了一个测试程序: #include int main(int argc, char *argv[]){ float f = 3.3; float* pf = &f; int i1 = (int) (*pf); int i2 = *((int*) pf); printf(“1: %d, 2: %d\n”, i1, i2); return 0; } 在我的系统上输出是 1: 3, 2: 1079194419 因此,转换指针似乎与转换值的方式不同。 […]