Malloc, structures, and casting
main.c — C source code, 2 KB (2708 bytes)
File contents
/* * main.c * * Created on: Oct 20, 2011 * Author: jshafer */ #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> struct my_structure { int data1; int data2; // The string will go here. *But*, we don't know how big of a string // the user will enter, so we can't put it as part of our structure. :-( char letter1; // Best we can do is use this single character as a pointer to // the beginning of what will be an entire array of characters... // The // rest // of // the // string (array) // will // come // here } __attribute__ ((packed)); // Prevent compiler from putting free space between variables int main(void) { // Temporary variables for user input int data1, data2; char data3[256]; // Collect data from users into temporary variables printf("Enter integer 1: "); scanf("%i", &data1); printf("Enter integer 2: "); scanf("%i", &data2); printf("Enter string 1 (max of 255 characters): "); scanf("%255s", data3); // Print data for debugging printf("Data collected is: %i %i '%s'\n", data1, data2, data3); // Declare a new *empty* buffer in memory big enough to hold all // collected data so far. int total_data_size_in_bytes = sizeof(struct my_structure) // Big enough for data1 and data2 - 1 // -1 because the struct has an extra char at the end + strlen(data3) // + enough space for the string +1; // + NULL char at end char* pointer_to_buffer_as_bytes = malloc(total_data_size_in_bytes); // Malloc() allocates memory and returns a pointer to the // buffer that can access it byte-by-byte (i.e. a pointer to an array of chars) // Cast a pointer to "my_structure" *over* the buffer created by malloc() // so that you can access individual fields in the buffer. struct my_structure* pointer_to_buffer_as_struct; // No structure here - just an empty pointer! pointer_to_buffer_as_struct = (struct my_structure*) pointer_to_buffer_as_bytes; // Casting // Copy data from the temporary variables into my new buffer // (which has convenient structure fields to make access easier) pointer_to_buffer_as_struct->data1 = data1; pointer_to_buffer_as_struct->data2 = data2; // strcpy() copies strings until it reaches the null character // (which is also copied) strcpy(&pointer_to_buffer_as_struct->letter1, data3); // Print data from structure for debugging printf("Data stored in struct is: %i %i '%s'\n", pointer_to_buffer_as_struct->data1, // Integer pointer_to_buffer_as_struct->data2, // Integer &pointer_to_buffer_as_struct->letter1); // First character of full string // Free dynamic memory when finished free(pointer_to_buffer_as_struct); return 0; }