Tag: 投射

转换指针 – 运行时有什么区别?

请考虑以下小示例代码: #include #include int main() { int *i; char *c1, *c2; i = malloc(4); *i = 65535; c1 = i; c2 = (char *)i; printf(“%p %p %p\n”, i, c1, c2); printf(“%d %d”, *c1, *c2); free(i); return 0; } 在这个例子中,我分配内存来存储一个整数,由i指出。 然后,我将值65535(1111 1111 1111 1111)存储在*i 。 我接下来要做的是使两个char *指针也指向整数。 我做了两次,但是以两种不同的方式: c1 = i; 和c2 = (char *)i; 。 […]

将void指针强制转换为char指针指针是否安全

只是想知道这样投射是否安全: char **cpp; // … allocation and what not void *vp = (void *)cpp; // … cpp = (char **)vp; 应该使用无效**还是无效*罚款? 这对我的几个盒子没有问题,但是想知道它是否会在某些系统上引起问题。

指针算术(char *)&a – (char *)&a == 4

如果a是一个int数组, (char*) &a[1] – (char *)&a[0]等于4,而&a[1] – &a[0]等于1.为什么会这样?

为什么char **(或任何T **)无效**无效?

在对Python C模块的第一条评论中–Malloc 在特定版本的Python中失败 ,@ user694733提到将char**为void**无效。 我读了从Foo **到void **的无效转换 – 为什么隐式类型转换允许void *但不是void **? 和http://c-faq.com/ptrs/genericpp.html但有一个标准的引用,但没有真正的例子,在这种情况下,这可能是不正确的,导致错误。 考虑例如void** double**或反之亦然,是否有可能出错的情况? 为什么(从技术上讲,不只是因为它是UB)?

当函数需要指针时传递一个常量整数

将常量整数值传递给需要指针的函数的最佳/最经典的方法是什么? 例如, writefunction write (int filedes, const void *buffer, size_t size); 假设我只想写一个字节(1),我会这样想: write (fd, 1, 1); 但我显然得到了警告 warning: passing argument 2 of ‘write’ makes pointer from integer without a cast 我知道我能做到 int i = 1; write (fd, &i, 1); 但这是必要的吗? 在不需要声明/初始化新变量的情况下,最正确的方法是什么?

不在C中转换指针会导致问题?

昨天我上课了,在某个时候讲师正在谈论C代码。 他说: 在C中制作指针的目的是什么? 唯一的目的是使编译器正确解释指针操作(例如,添加int指针将导致与添加char指针不同的偏移量)。 除此之外,没有区别:所有指针在内存中的表示方式相同,无论指针指向int值,char值,short值等等。 因此,转换指针不会修改内存中的任何内容,它只会帮助程序员执行与他正在处理的指针类型更相关的操作。 但是,我已经阅读,特别是在Stack Overflow中,这不是100%真实。 我已经读过,在一些奇怪的机器中,不同类型的指针可以以不同的方式存储在内存中。 在这种情况下,如果将代码编译为此类机器,则不将指针更改为正确的类型可能会导致问题。 基本上,这是我正在谈论的那种代码。 考虑以下代码: int* int_pointer; char* char_pointer; int_pointer = malloc(sizeof(int)); *int_pointer = 4; 现在有两种选择: 1。 char_pointer = (char *)int_pointer; 2。 char_pointer = int_pointer; 案例2的代码可能成为一个问题? 制作演员表(案例1)最终会改变内存中的指针格式(如果是的话,你能给出一个机器的例子吗?)? 谢谢

Little endian与Big endian

假设我有4Byte整数,我想将它转换为2Byte短整数。 我是对的,在(小端和大端)短整数将包含这个4Byte整数的2个最低有效字节? 第二个问题: 小端和大端处理器中这些代码的结果是什么? int i = some_number; short s = *(short*)&i; 在大端处理器2中的恕我直言,将复制最重要的字节,在小端,将复制2个最低有效字节。

类型转换char指针在C中浮动

我有一个包含ff数据的平面文件: date;quantity;price;item 我想使用以下结构创建数据记录: typedef struct { char * date, * item; int quantity; float price, total; } expense_record; 我创建了以下初始化方法: expense_record initialize(char * date, int quantity, char *price, char *item) { expense_record e; e.date = date; e.quantity = quantity; e.item = item; /* set price */ return e; } 我的问题是如何从char *price将价格设置为float (根据结构的要求)。 我得到的最接近,即没有产生编译错误 e.price = *(float […]

指针转换为与qsort一起使用

从我正在阅读的书中复制的代码片段手: /* scmp: string compare of *p1 and *p2 */ int scmp(const void *p1, const void *p2) { char *v1, *v2; v1 = *(char **) p1; v2 = *(char **) p2; return strcmp(v1, v2); } 此函数与qsort一起用于对字符串数组进行排序。 我不明白的一点是,为什么v1 = *(char **) p1; 而不仅仅是v1 = (char *) p1; 或者甚至不会这样做; v1 = p1; ? 我想编译器应该自动对该分配进行类型转换。 或者甚至,考虑一下: /* scmp: […]

为什么我可以隐式地将int文字转换为C中的int *而不是C ++中的int *?

我相信在下面的代码中,C“自动将17转换为int * ”,正如有人最近指出的那样(但没有说明原因),这是错误的。 int *ptoi = 17; // I assumed that 17 is being automatically casted to int * 我知道如果我在C ++中执行与上面相同的操作,我会收到一条错误,指出invalid conversion from int to int * 。 但是,如果我在C ++中执行以下操作,它可以正常工作: int *ptoi = (int *)17; 这些是我认为在C中,铸造是隐含的原因。 有人可以解释为什么,在C ++中,我必须使用它,但在C中,它工作正常吗?