C语言中不同类型的指针互相转换的注意点

为什么写本文?

之所以想起来写这篇文章,是因为最近的项目代码频频报出“break strict-aliasing rules”相关的warnning信息,追其原因就是因为不同类型的指针之间的强转引起的。我相信大家平日或多或少写过本文出现的代码,甚至有时候会因这样的trick而感到兴奋,因为很多情况下,这样的代码运行结果是没有问题的。

本文就不同类型的指针之间的转化做个比较详实的阐述:什么情况下,它们之间可以转化而不会引起问题,而又在什么情况下,强转会发生意想不到的结果呢? 关于这一切标准又是怎么说的呢? 这都是本文需要搞清楚的问题。

 

参考连接:

Why is this implicit conversion (between different pointer types) valid?

Casting one struct pointer to other - C

Converting a pointer to different type in C

Is This “Type Punning” Well-Defined?》

Pointers in C, Part III: The Strict Aliasing Rule

What is the Strict Aliasing Rule and Why do we care?

 

 

Understanding Strict Aliasing

Understanding C/C++ Strict Aliasing

Strict aliasing in C

strict aliasing

Type-punning and the strict aliasing rule

ARM: Efficient C for ARM: Pointer Aliasing

GCC, strict aliasing, C99

GCC strict aliasing

About the C ++ aliasing, dexterous optimization and mean bugs

strict aliasing

Strict aliasing...

Strict Aliasing,神坑?

C/C++ Strict Alias 小记

The Strict Aliasing Situation is Pretty Bad

《Type Punning, Strict Aliasing, and Optimization

gcc strict-aliasing是什麼?

GCC:strict-aliasing rules

Restricting what you can do

Strict aliasing and std::vector

Solving the gcc 4.4 strict aliasing problems

C pointer aliasing violiations and aggressive compiler optimizations

Type punning, aliasing, unions, strict-aliasing, oh my!

C99 Strict Aliasing Rules and Packed Streams

What is the strict aliasing rule?

Solving the gcc 4.4 strict aliasing problems

Type-punning and the strict aliasing rule

GCC strict aliasing pitfall

How to Access Safely Unaligned Data

 

Demystifying The Restrict Keyword

RESTRICT, Keyword for Low-Level Pointer Efficiency

The restrict keyword in C programming

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Q:'pointers to different types at argument' 的意思是什么? A:'pointers to different types at argument' 的意思是参数是指向不同类型指针。 ### 回答2: 指向不同类型的参数指针是一种在C语言使用广泛的编程技术,它允许函数接受不同类型的参数作为输入,并且能够对这些参数进行操作。 使用指向不同类型的参数指针,可以让函数更加通用,因为它可以接受不同类型的参数作为输入。这种技术的最基本的应用就是在函数的参数使用void指针,它可以接受任何类型指针作为输入。函数内部通过将void指针转换为实际的指针类型,可以进行对参数的操作。 除了使用void指针外,还可以通过使用强制类型转换将参数指针转换不同指针类型。这种方式可以在函数接受不同类型指针参数时使用。例如,当一个函数需要同时接受int和float类型指针时,可以使用强制类型转换将参数指针转换为相应的类型,然后进行对应的操作。 在使用指向不同类型的参数指针时,需要注意指针类型与指向的数据类型一致,否则会产生未定义的行为。此外,由于指向不同类型的参数指针可能存在类型转换的操作,因此需要谨慎处理指针类型,以避免出现错误和潜在的安全问题。 综上所述,指向不同类型的参数指针是一种非常有用的编程技术,可以让函数更加通用,并可以接受不同类型的参数作为输入。但在使用时需要注意指针类型类型转换的问题,以保证代码正确和安全。 ### 回答3: 指针是一种数据类型,它存储了一个内存地址,可以用该地址访问存储在该地址的数据。指针类型的变量在C和C++非常常见,因为它们可以帮助我们传递参数和操作内存。关于传递参数,指针可以指向不同类型的数据,包括整数、字符、浮、结构体、甚至其他指针指针类型定义是由它所指向的对象的类型决定的。例如,一个整型指针类型可以定义为int *,这意味着它指向一个整型变量的地址。同样的,一个字符指针类型可以定义为char *,它指向一个字符变量的地址。指针类型由编程人员显式地声明,这可以确保在编译时代码被正确的处理,同时也有利于代码的可读性和维护性。 在传递指针作为函数参数时,可以使用抽象的指针类型(void *),它可以指向任意类型的数据。使用这种抽象类型指针,可以将不同类型的数据传递给函数,并让函数改变这些数据的值。然而,使用void指针类型需要谨慎,因为它不提供类型检查,可能导致运行时错误。 指针的另一个重要特性是指针运算。指针可以通过加、减或比较运算对内存地址进行操作。这是非常实用的,它允许我们操作结构体、数组和字符串。例如,可以使用指针对字符串进行搜索、排序和替换操作。 尽管指针可以非常灵活地指向不同类型的数据对象,但也需要非常小心的使用它们。指针可能会指向不存在的内存地址或垃圾内存,这可能导致程序崩溃或不确定的结果。对指针进行充分的验证和检查可以帮助确保程序的正确性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值