我有一个函数,它接受“struct sockaddr *”作为参数(我们称之为input_address),然后我需要对该地址进行操作,该地址可能是sockaddr_in或sockaddr_in6 ,因为我支持IPv4和IPv6。安全地从struct sockaddr转换为struct sockaddr_storage
我得到一些内存损坏,并试图追查它的来源,并在过程中发现一些代码似乎怀疑,所以我想验证,如果这是正确的方式做事情。
struct sockaddr_storage *input_address_storage = (struct sockaddr_storage *) input_address;
struct sockaddr_storage result = [UtilityClass performSomeOperation: *input_address_storage];
起初我以为在第一线投是安全的,但随后在第二行,我需要取消引用该指针,这似乎像它可能是错误的。我担心的原因是它最终可能会复制超出原始结构的内存(因为sockaddr_in比sockaddr_in6更短)。我不确定这是否会导致内存损坏(我的猜测是否定),但是这段代码给了我一个不好的感觉。
我不能改变我的函数采用“struct sockaddr *”的事实,所以看起来好像很难解决这种类型的代码,但我想避免从内存位置复制I不应该。
如果任何人都可以验证我所做的是否是错误的,并且解决这个问题的最佳方法,我会很感激。
编辑:由于某种原因,管理员已将C标签更改为C#。我给出的代码主要是C,而来自目标C的一个函数调用并不重要。该呼叫可能是C.
感谢您的解释。你说的是有道理的,但是它并不直接解决我的问题,因为我的要求是我有一个函数需要一个“struct sockaddr *”,所以我必须做相反的事情。所以问题是,假设我需要做相反的事情,那么做到这一点的正确方法是什么。 – Locksleyu