Tag: 指针 算术

不同类型指针之间的减法

我试图找到两个变量之间的内存距离。 具体来说,我需要找到char []数组和int之间的距离。 char data[5]; int a = 0; printf(“%p\n%p\n”, &data[5], &a); long int distance = &a – &data[5]; printf(“%ld\n”, distance); 当我在没有最后两行的情况下运行我的程序时,我得到了两个变量的正确内存地址,如下所示: 0x7fff5661aac7 0x7fff5661aacc 现在我明白了,如果我没错,两者之间有5个字节的距离(0x7fff5661aac8,0x7fff5661aac9,0x7fff5661aaca,0x7fff5661aacb,0x7fff5661aacc)。 为什么我不能减去类型(int *)和类型(char *)之一的指针。 两者都是指内存地址..我该怎么做才能计算两者之间的距离,以字节为单位? 我尝试了两个指针中的一个,但它不起作用。 我得到:“ 错误:’char *’和’int *’不是兼容类型的指针 ”。 谢谢大家都会帮助我

你可以将“指向函数指针的指针”转换为void *

灵感来自对我的回答的评论。 这一系列步骤在C标准(C11)中是否合法? 创建一个函数指针数组 获取指向第一个条目的指针并将该指针转换为函数指针 void* 对该void*执行指针算术void* 将其强制转换为指向函数指针的指针并取消引用它。 或者相当于代码: void foo(void) { … } void bar(void) { … } typedef void (*voidfunc)(void); voidfunc array[] = {foo, bar}; // Step 1 void *ptr1 = array; // Step 2 void *ptr2 = (char*)ptr1 + sizeof(voidfunc); // Step 3 voidfunc bar_ptr = *(voidfunc*)ptr2; // Step 4 我认为这是允许的,因为实际的函数指针只能通过正确的类型指针访问。 但Andrew Henle指出, […]

如何明智地解释这个编译器警告?

当我执行这个问题的代码时,我得到了这个警告: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long int’ [-Wformat=] printf(“PQ: %d, P: %d, Q: %d”, (p – q), p, q); ~^ ~~~~~~~ %ld 作为reflection修复,我使用%ld来打印两个指针的减法。 编制者同意了。 幸运的是,我看到另一位用户提到应该使用%td的评论,因为减法的结果类型是ptrdiff_t 。 这个答案证实了这一说法。 现在从GCC的stddef.h头文件中,我可以看到这些类型在这种情况下是等价的: typedef __PTRDIFF_TYPE__ ptrdiff_t; #define __PTRDIFF_TYPE__ long int 但是,我只是建议对OP的错误(或多或少)修复,使用%ld而不是%td 。 有没有办法让我理解单独的编译器警告是不够的? 或者也许明智地解释警告本身,而不仅仅是反应。