/* test_file.txt 1234567890 */ #include #include #include bool LoadFileToZTMemBufferTest( char *file_name, char **p_buffer, size_t *p_size ) { FILE *fp = NULL; *p_buffer = NULL; *p_size = 0; size_t file_size; size_t buffer_size; size_t result; fp = fopen( file_name, "rb" ); if(!fp) { printf("Error: cannot open file \"%s\"\n", file_name ); return false; } fseek( fp, 0, SEEK_END ); file_size = ftell( fp ); fseek( fp, 0, SEEK_SET ); buffer_size = file_size + 1; *p_buffer = calloc( buffer_size, sizeof(char) ); if( !*p_buffer ) { printf("Error: memory allocation error\n"); fclose( fp ); return false; } result = fread( *p_buffer, 1, file_size, fp ); if( result != file_size ) { free(*p_buffer); *p_buffer = NULL; fclose(fp); printf("Error: error reading file\n"); return false; } fclose( fp ); *p_size = buffer_size; //v1 char *p_tmp = *p_buffer; printf("(1a) %p\n", (void*) p_tmp); p_tmp += file_size; printf("(1b) %p\n", (void*) p_tmp); *p_tmp = '\0'; //v2 printf("(2a) %p\n", (void*) (*p_buffer + file_size) ); *( *p_buffer + file_size ) = '\0'; //v3 (*p_buffer)[file_size] = '\0'; printf("(3a) %p\n", (void*) &(*p_buffer)[file_size] ); // test printf( "(test 1) %p\n", (void*) p_buffer); printf( "(test 2) %p\n", (void*) p_buffer[0]); printf( "(test 3) %p\n", (void*) *p_buffer); return true; } int main() { char *p_buff = NULL; size_t size = 0; printf( "Buffer address before: %p\n", (void*) p_buff); printf( "Address of pointer: %p\n", (void*) &p_buff); if(!LoadFileToZTMemBufferTest( "test_file.txt", &p_buff, &size )) { printf("Error: LoadFileToZTMemBufferTest\n"); return 1; } printf("Buffer size: %zu\n", size); printf( "Buffer address after: %p\n", (void*) p_buff); free(p_buff); return 0; } /* output: Buffer address before: (nil) Address of pointer: 0x7fffc4573678 (1a) 0x561131e698a0 (1b) 0x561131e698aa (2a) 0x561131e698aa (3a) 0x561131e698aa (test 1) 0x7fffc4573678 (test 2) 0x561131e698a0 (test 3) 0x561131e698a0 Buffer size: 11 Buffer address after: 0x561131e698a0 */