Answers/Solutions to Exercises in Chapter 10, Exercise 5

E5: Write a simple C program that does some allocation and deallocation of memory. Make sure that it uses realloc(). Then use
the techniques from this chapter to make all the memory handling functions location sensitive (using __FILE__ and __LINE__) and writing into a log all memory transactions (you can use the logging functions from Appendix D).

A5:  We are using the code from Exrcise 3, Chapter 7 as the bases. We are also using simplified logging functions from Appendix D.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

void sys_exit(char *fmt, ...);
void sys(char *fmt, ...);
void msg_exit(char *fmt, ...);
void msg(char *fmt, ...);
void Sys_exit(char *fmt, ...);
void Msg_exit(char *fmt, ...);
void Sys(char *fmt, ...);
void Msg(char *fmt, ...);
void print_msg(char *fmt,va_list ap,char* where);
void open_log(char* name);
char logpath[500] = "";
char buf[500];


// function Realloc -----------------------------------------
void* Realloc(void* p,size_t t,char* file,int line)
{
	msg("[file=\"%s\",line=%d], reallocation segment at address %x to new size %d\n",
		file,line,p,t);
	p = realloc(p,t);	
	msg("[file=\"%s\",line=%d],segment reallocated to address %x\n",file,line,p);
	return p;
}

// function Malloc -------------------------------------------
void* Malloc(size_t t,char* file,int line)
{
	void* p;
	p = malloc(t);	
	msg("[file=\"%s\",line=%d],segment of size %d allocated at address %x\n",file,line,t,p);
	return p;
}

// function Free ----------------------------------------------
void Free(void* p,char* file,int line)
{
	free(p);
	msg("[file=\"%s\",line=%d],segment at address %x deallocated\n",file,line,p);
}

#define realloc(a,b) Realloc(a,b,__FILE__,__LINE__)
#define malloc(a) Malloc(a,__FILE__,__LINE__)
#define free(a) Free(a,__FILE__,__LINE__)



// function add_column -----------------------------------------
void add_column(int** array,int rows,int columns)
{
	int i;

	for(i=0; i<rows; i++) {
	 array[i]=(int*) realloc(array[i],sizeof(int)*(columns+1));
	 array[i][columns]=10*i+columns;
	}

}// end add_column


// function doit ------------------------------------------
void doit()
{
	int i, j, **array;

	array = (int**) malloc(sizeof(int*)*4);  // 4 rows
	for(i=0; i<4; i++) {
	 array[i]=(int*) malloc(sizeof(int)*3);  // 3 columns
	 for(j=0; j<3; j++)
	  array[i][j]=10*i+j;
	}
	for(i=0; i<4; i++)
	 for(j=0; j<3; j++)
	  printf("array[%d][%d]=%d\n",i,j,array[i][j]);

	// and a new column
	add_column(array,4,3);

	// now display it again
    	for(i=0; i<4; i++)
	 for(j=0; j<4; j++)
	  printf("array[%d][%d]=%d\n",i,j,array[i][j]);

	 //now we are going to deallocate it
	 for(i=0; i<4; i++)
		 free((void*)array[i]);
	 free((void*)array);
	 return;
}// end doit
// function main --------------------------------------------
int main()
{
	return 0;
}// end main

/* simplified logging functions --- without locking, without time, without multiprocessing,
   without multithreading */

/* function sys_exit ------------------------------------------- */
void sys_exit(char *fmt, ...)
{
 va_list ap;

 printf("[system error] ");
 va_start(ap,fmt);
 print_msg(fmt,ap,0);
 va_end(ap);
 exit(1);
}/* end sys_exit */

/* function sys ------------------------------------------- */
void sys(char *fmt, ...)
{
 va_list ap;
 
 printf("[system error] ");
 va_start(ap,fmt);
 print_msg(fmt,ap,0);
 va_end(ap);
}/* end sys */

/* function msg_exit ------------------------------------------- */
void msg_exit(char *fmt, ...)
{
 va_list ap;
 
 va_start(ap,fmt);
 print_msg(fmt,ap,0);
 va_end(ap);
 exit(1);
}/* end msg_exit */

/* function msg ------------------------------------------- */
void msg(char *fmt, ...)
{
 va_list ap;
 
 va_start(ap,fmt);
 print_msg(fmt,ap,0);
 va_end(ap);
}/* end msg */

/* function Sys_exit ------------------------------------------- */
void Sys_exit(char *fmt, ...)
{
 va_list ap;

 va_start(ap,fmt);
 print_msg(fmt,ap,"[system error] ");
 va_end(ap);
 exit(1);
}/* end Sys_exit */

/* function Msg_exit ------------------------------------------- */
void Msg_exit(char *fmt, ...)
{
 va_list ap;
 
 va_start(ap,fmt);
 print_msg(fmt,ap,"[]");
 va_end(ap);
 exit(1);
}/* end Msg_exit */

/* function Sys ------------------------------------------- */
void Sys(char *fmt, ...)
{
 va_list ap;
 
 va_start(ap,fmt);
 print_msg(fmt,ap,"[]");
 va_end(ap);
}/* end Sys */
 
/* function Msg ------------------------------------------- */
void Msg(char *fmt, ...)
{
 va_list ap;
 
 va_start(ap,fmt);
 print_msg(fmt,ap,"[]");
 va_end(ap);
}/* end Msg */

/* function print_msg ------------------------------------------- */
void print_msg(char *fmt,va_list ap,char* where)
{
 FILE* fp;
 
 vsprintf(buf,fmt,ap);
 if (where==0) 
   printf("%s\n",buf);
 else{
   fp = fopen(logpath,"a");
   if (fp == NULL) {
     printf("problem to open log\n");
     exit(1);
   }
   fprintf(fp,"%s%s\n",where,buf);
 }
}/* end print_msg */

/* function open_log ------------------------------------------ */
void open_log(char* name)
{
 FILE* fp;

 strcpy(logpath,name);
 fp = fopen(logpath,"w");
 if (fp == NULL) {
   printf("error opening log\n");
   exit(1);
 }
 fprintf(fp,"log opened\n");
 fclose(fp);
}/* end open_log */

Output:

[file="C:\Documents and Settings\Dr. F. Franek\Desktop\membook-programs\p1.cpp",
line=190],segment of size 16 allocated at address 431fa0

[file="C:\Documents and Settings\Dr. F. Franek\Desktop\membook-programs\p1.cpp",
line=192],segment of size 12 allocated at address 431f60

[file="C:\Documents and Settings\Dr. F. Franek\Desktop\membook-programs\p1.cpp",
line=192],segment of size 12 allocated at address 431f20

[file="C:\Documents and Settings\Dr. F. Franek\Desktop\membook-programs\p1.cpp",
line=192],segment of size 12 allocated at address 431ee0

[file="C:\Documents and Settings\Dr. F. Franek\Desktop\membook-programs\p1.cpp",
line=192],segment of size 12 allocated at address 431ea0

array[0][0]=0
array[0][1]=1
array[0][2]=2
array[1][0]=10
array[1][1]=11
array[1][2]=12
array[2][0]=20
array[2][1]=21
array[2][2]=22
array[3][0]=30
array[3][1]=31
array[3][2]=32
[file="C:\Documents and Settings\Dr. F. Franek\Desktop\membook-programs\p1.cpp",
line=176], reallocation segment at address 431f60 to new size 16

[file="C:\Documents and Settings\Dr. F. Franek\Desktop\membook-programs\p1.cpp",
line=176],segment reallocated to address 431f60

[file="C:\Documents and Settings\Dr. F. Franek\Desktop\membook-programs\p1.cpp",
line=176], reallocation segment at address 431f20 to new size 16

[file="C:\Documents and Settings\Dr. F. Franek\Desktop\membook-programs\p1.cpp",
line=176],segment reallocated to address 431f20

[file="C:\Documents and Settings\Dr. F. Franek\Desktop\membook-programs\p1.cpp",
line=176], reallocation segment at address 431ee0 to new size 16

[file="C:\Documents and Settings\Dr. F. Franek\Desktop\membook-programs\p1.cpp",
line=176],segment reallocated to address 431ee0

[file="C:\Documents and Settings\Dr. F. Franek\Desktop\membook-programs\p1.cpp",
line=176], reallocation segment at address 431ea0 to new size 16

[file="C:\Documents and Settings\Dr. F. Franek\Desktop\membook-programs\p1.cpp",
line=176],segment reallocated to address 431ea0

array[0][0]=0
array[0][1]=1
array[0][2]=2
array[0][3]=3
array[1][0]=10
array[1][1]=11
array[1][2]=12
array[1][3]=13
array[2][0]=20
array[2][1]=21
array[2][2]=22
array[2][3]=23
array[3][0]=30
array[3][1]=31
array[3][2]=32
array[3][3]=33
[file="C:\Documents and Settings\Dr. F. Franek\Desktop\membook-programs\p1.cpp",
line=210],segment at address 431f60 deallocated

[file="C:\Documents and Settings\Dr. F. Franek\Desktop\membook-programs\p1.cpp",
line=210],segment at address 431f20 deallocated

[file="C:\Documents and Settings\Dr. F. Franek\Desktop\membook-programs\p1.cpp",
line=210],segment at address 431ee0 deallocated

[file="C:\Documents and Settings\Dr. F. Franek\Desktop\membook-programs\p1.cpp",
line=210],segment at address 431ea0 deallocated

[file="C:\Documents and Settings\Dr. F. Franek\Desktop\membook-programs\p1.cpp",
line=211],segment at address 431fa0 deallocated

Back to Answers/Solutions Index                          Back to Answers/Solutions for Chapter 10 Index