Hi and many thanks for the replies,

I can understand that a pointer being an address depends heavily on
machine architecture which means, on 32 bit machines it is 4 bytes
long and on 64 bit machines it is 8 bytes long. I also understand that
a pointer variable is essentially made of two parts as illustrated
below:

address [always allocated] ------------------> data [not allocated
automatically]

The address does depend on architecture but the data? And what else
can enter into a pointer's definition other than what I illustrated?

Compound/complex pointer definitions like data_type** U, work as
follows as far as my intellect can reason and deduce from what I
studied and from my now long experience coding.

address1[allocated] -----> address2[NOT allocated] ----->
data_type[not allocated]

My mistake was to assume in the case of data_type** U the compiler
would allocate the two addresses and link them, that is, store the
address of address2 in address1. The latter is not the case and a
coder is required to first allocate space for the 2nd address. In
fact, allocating space for void** ptr, in a sample program worked
without issues. I am attaching this sample program.

Edward

On 29/03/2016, Rainer Weikusat <[email protected]> wrote:
> Hendrik Boom <[email protected]> writes:
>> On Tue, Mar 29, 2016 at 02:46:50PM +0100, Rainer Weikusat wrote:
>>> This is a wrong assumption and it relies on behaviour the C standard
>>> doesn't guarantee. Any pointer may be converted (it's even converted
>>> automatically as required) to a void * and back and
>>>
>>> "the result shall compare equal to the original pointer"
>>>
>>> But a pointer to a void * is an entirely different animal and no such
>>> guarantees are made for that. This will work in practice if there's only
>>> one 'machine pointer type' anyway, though. But using it is not necessary
>>> as void * is sufficient.
>>
>> Last time I looked at the C standard (which was a while ago, things may
>> have changed) function pointers were not guaranteed to be
>> interconvertable with data pointers.
>
> Indeed. I didn't remember this while writing the text.
> _______________________________________________
> Dng mailing list
> [email protected]
> https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/dng
>
#include <stdio.h>
#include <stdlib.h>

typedef enum {t_int, t_float, t_double, t_long_double} t_data;

int alloc_datum(void** datum, t_data type) {
  //if (*datum != NULL) return 2; // non null *datum
  switch (type) {
	  case t_int: 
		  *datum = malloc(sizeof(int));
			break;
		case t_float:
		  *datum = malloc(sizeof(float));
			break;
		case t_double:
		  *datum = malloc(sizeof(double));
		  break;
		case t_long_double:
		  *datum = malloc(sizeof(long double));
			break;			
  }

	if (datum == NULL)
	  return 1; // malloc failed to allocate memory
		else return 0;
}

int main() {
  int* ii;
	long* ll;
	float* ff;
	double* dd;
	long double* dddd;
	
	void** ptr;
	ptr = malloc(sizeof(void*));
	
	
	alloc_datum(ptr, t_int);
	ii = *ptr;
	*ii = 10;
	alloc_datum(ptr, t_float);
	ff = *ptr;
	*ff = 5.97E24;
	alloc_datum(ptr, t_double);
	dd = *ptr;
	*dd = 2E30;
	alloc_datum(ptr, t_long_double);
	dddd = *ptr;
	*dddd = 1.5E299;
	free(ptr);
	
	printf("*11 is %d\n", *ii);
	printf("*ff is %e\n", *ff);
	printf("*dd is %e\n", *dd);
	printf("*dddd is %Le\n", *dddd);
	
	free(ii);
	free(ff);
	free(dd);
	free(dddd);

  return 0;
}
_______________________________________________
Dng mailing list
[email protected]
https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/dng

Reply via email to