c - Is casting to pointers to pointers to void always safe? -
#include <stdio.h> void swap(void *v[], int i, int j) { void *tmp; tmp = v[i]; v[i] = v[j]; v[j] = tmp; } int main(void) { char *s[] = {"one", "two"}; printf("%s, %s\n", s[0], s[1]); swap(s, 0, 1); printf("%s, %s\n", s[0], s[1]); return 0; }
output:
one, 2 two, 1
warning: no compatible pointer casting, need void**, char
i used program simulate swap function in k&r, demonstrate use of function pointer, , question whether cast of void pointer
safe, or if there way replace it.
no, not safe pass char**
void**
(which void*[]
function parameter is) expected. fact compiler makes perform explicit cast hint that.
in practice, fine. strictly speaking, however, have no guarantee sizeof (t*) == sizeof (u*)
distinct types t
, u
. (for example, imagine hypothetical system sizeof (int*) < sizeof (char*)
because pointers-to-int
aligned , therefore don't need store least significant bits.) consequently, swap
function might index v
array using wrong offsets.
also see q4.9 comp.lang.c faq: can give formal parameter type void **
, , this?
to call swap
safely, should like:
void* temp[] = { &s[0], &s[1] }; swap(temp, 0, 1);
although swap elements of temp
, not of s
.
if you're authoring swap
, in general should make such function take void*
argument (instead of void**
one) , size_t
argument specifies size of each element. function cast void*
char*
safely , swap individual bytes:
void swap(void* p, size_t elementsize, size_t i, size_t j) { char* item1 = p; char* item2 = p; item1 += * elementsize; item2 += j * elementsize; while (elementsize-- > 0) { char temp = *item1; *item1 = *item2; *item2 = temp; item1++; item2++; } }
edit: see this stackoverflow answer similar question.
Comments
Post a Comment