在自己的sizeof API中,有什么必要使用(char*)类型化?

问题描述 投票:-1回答:1
#include<stdio.h>
#define my_sizeof(type) (&type+1) - (&type) 

int main()
{   
 int y;
 printf("size_of int: %ld\n", sizeof(y));
 printf("address of y = %x \n",&y);
 printf("address of y +1 = %x \n", &y+1);

 printf("The sizeof = %d\n", my_sizeof(y));
 getchar();
 return 0;
}

输出。

  size_of int:  4
  address of y =  26f890
  address of y +1 =  26f894
  The sizeof =  1

我希望得到的是 my_sizeof 输出为 "4"(即26f894 - 26f890),但打印为 "1"。

假设如果我把它打成 char* (即......)输出为 "4"。(char*) (&type+1) - (char*)(&type))的输出为 "4"。

谁能告诉我需要 (char*) typecasting.?

c operator-keyword sizeof
1个回答
1
投票

在这个表达式中

(&type+1) - (&type)

有使用指针运算。指向同一个数组的元素或数组最后一个元素的两个指针之间的差别等于两个指针之间的元素数。

而在你的系统中,一个int类型的对象占用4个字节,那么将指针投向char *类型就会产生4个。

摘自C标准(6.5.6加法运算符)

9 当两个指针相减时,两个指针都应指向同一个数组对象的元素,或数组对象最后一个元素过去一个;结果是两个数组元素的下标之差...。

对于指针运算来说,一个对象被认为是一个有一个元素的数组。


0
投票

我已经纠正了很多UB,在 printfs

#include<stdio.h>
#define my_sizeof(type) ((char *)(&type+1) - (char *)(&type))

int main()
{   
 int y;
 printf("size_of int: %zu\n", sizeof(y));
 printf("address of y = %p \n",(void *)&y);
 printf("address of y +1 = %p \n", (void *)(&y+1));

 printf("The sizeof = %zu\n", my_sizeof(y));
 getchar();
 return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.