Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Special Interest Groups
  3. C++ Gurus
  4. i want to understand how dynamic memory allocation done for result of sqlite3_get_table with malloc ?
Forum Updated to NodeBB v4.3 + New Features

i want to understand how dynamic memory allocation done for result of sqlite3_get_table with malloc ?

Scheduled Pinned Locked Moved Solved C++ Gurus
18 Posts 3 Posters 3.2k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • JonBJ JonB

    @Qt-embedded-developer

    • recordset is a 2D array/table. It holds all the rows, and is indexed by row number. There are a total of nrows allocated.
    • recordset[row] is one row. It holds an array of the columns in the row. There are a total of ncols allocated.
    • recorset[row][col] is one cell/value, in one column of one row. The column values are char *, i.e. C-strings. For each one the length of the string plus 1 byte for '\0' is alloacted.

    rows -> columns -> cells/values of type C-string.

    Q Offline
    Q Offline
    Qt embedded developer
    wrote on last edited by
    #7

    @JonB Hi can you give example for deallocate memory for recordset ?

    JonBJ 1 Reply Last reply
    0
    • Q Qt embedded developer

      @JonB Hi can you give example for deallocate memory for recordset ?

      JonBJ Offline
      JonBJ Offline
      JonB
      wrote on last edited by
      #8

      @Qt-embedded-developer
      This is absolutely basic C! If you malloc(), what function do you have to call to free the allocated memory?

      Q 1 Reply Last reply
      0
      • JonBJ JonB

        @Qt-embedded-developer
        This is absolutely basic C! If you malloc(), what function do you have to call to free the allocated memory?

        Q Offline
        Q Offline
        Qt embedded developer
        wrote on last edited by Qt embedded developer
        #9

        @JonB i have to call free() to deallocate memory.

        void free(void *ptr);

        i have to free recordset memory inside below part else condition

        if (ret != SQLITE_OK) {
               printf("SQL error: %s\n", err_messg);
               sprintf(RET, "%d", ret);
               // InsertErrorLog
        //        if (strcmp(strErrorLogDescription, "") != 0) {
        //            InsertErrorlog("", 0, 0, err_messg, strErrorLogDescription);
        //        }
               success = 0;
           } else {
               resultSet_Table.rows = nrow;
               resultSet_Table.cols = ncol;
               resultSet_Table.recordset = recordset;
               success = 1;
           }
        
        JonBJ 1 Reply Last reply
        0
        • Q Qt embedded developer

          @JonB i have to call free() to deallocate memory.

          void free(void *ptr);

          i have to free recordset memory inside below part else condition

          if (ret != SQLITE_OK) {
                 printf("SQL error: %s\n", err_messg);
                 sprintf(RET, "%d", ret);
                 // InsertErrorLog
          //        if (strcmp(strErrorLogDescription, "") != 0) {
          //            InsertErrorlog("", 0, 0, err_messg, strErrorLogDescription);
          //        }
                 success = 0;
             } else {
                 resultSet_Table.rows = nrow;
                 resultSet_Table.cols = ncol;
                 resultSet_Table.recordset = recordset;
                 success = 1;
             }
          
          JonBJ Offline
          JonBJ Offline
          JonB
          wrote on last edited by JonB
          #10

          @Qt-embedded-developer
          So write the code to call free()s corresponding to where you did your malloc()s. What else is there to ask/say?

          Q 1 Reply Last reply
          0
          • JonBJ JonB

            @Qt-embedded-developer
            So write the code to call free()s corresponding to where you did your malloc()s. What else is there to ask/say?

            Q Offline
            Q Offline
            Qt embedded developer
            wrote on last edited by Qt embedded developer
            #11

            @JonB

            i have allocated memory like below so to where and how to write free() for this all allocated memory.

            recordset = (char ***) malloc(nrow * sizeof (char **));
                for (count = ncol; count < ((nrow + 1) * ncol); count++) {
            
                    printf("Enter in LOOP\n");
                    recordset[i] = (char **) malloc(ncol * sizeof (char *));
                    for (j = 0; j < ncol; j++) {
                        printf("%s ", result[count]);
                        recordset[i][j] = (char *) malloc((strlen(result[count]) + 1));
                        strcpy(recordset[i][j], result[count]);
            
                        if (j != (ncol - 1))
                            count++;
                    }
                    i++;
                    printf("\n");
                }
            

            in else part if i wrote code like below. is it right ?
            ```
            free(recordset);
            for (count = ncol; count < ((nrow + 1) * ncol); count++) {

                printf("Enter in LOOP\n");
                free(recordset[i]); 
                for (j = 0; j < ncol; j++) {
                    free(recordset[i][j]);
                }
                i++;
                printf("\n");
            }
            
            JonBJ 1 Reply Last reply
            0
            • Q Qt embedded developer

              @JonB

              i have allocated memory like below so to where and how to write free() for this all allocated memory.

              recordset = (char ***) malloc(nrow * sizeof (char **));
                  for (count = ncol; count < ((nrow + 1) * ncol); count++) {
              
                      printf("Enter in LOOP\n");
                      recordset[i] = (char **) malloc(ncol * sizeof (char *));
                      for (j = 0; j < ncol; j++) {
                          printf("%s ", result[count]);
                          recordset[i][j] = (char *) malloc((strlen(result[count]) + 1));
                          strcpy(recordset[i][j], result[count]);
              
                          if (j != (ncol - 1))
                              count++;
                      }
                      i++;
                      printf("\n");
                  }
              

              in else part if i wrote code like below. is it right ?
              ```
              free(recordset);
              for (count = ncol; count < ((nrow + 1) * ncol); count++) {

                  printf("Enter in LOOP\n");
                  free(recordset[i]); 
                  for (j = 0; j < ncol; j++) {
                      free(recordset[i][j]);
                  }
                  i++;
                  printf("\n");
              }
              
              JonBJ Offline
              JonBJ Offline
              JonB
              wrote on last edited by JonB
              #12

              @Qt-embedded-developer
              No, that is not right.

              You are freeing the items in the same order as you allocated them. Once you have done free(recordset) you must not then do free(recordset[i]), and once you have done free(recordset[i]) you must not then do free(recordset[i][j]).

              Please stop and think about it/why. This is basic C. free() things in the opposite order to how you built your structure with malloc(). Do not free() something if you then go into it to access/free() something else.

              Q 1 Reply Last reply
              1
              • JonBJ JonB

                @Qt-embedded-developer
                No, that is not right.

                You are freeing the items in the same order as you allocated them. Once you have done free(recordset) you must not then do free(recordset[i]), and once you have done free(recordset[i]) you must not then do free(recordset[i][j]).

                Please stop and think about it/why. This is basic C. free() things in the opposite order to how you built your structure with malloc(). Do not free() something if you then go into it to access/free() something else.

                Q Offline
                Q Offline
                Qt embedded developer
                wrote on last edited by Qt embedded developer
                #13

                @JonB means i need to write code like below:

                int i = 0;
                
                for (count = ncol; count < ((nrow + 1) * ncol); count++) {
                
                    printf("Enter in LOOP\n");
                  
                    for (j = 0; j < ncol; j++) {
                        free(recordset[i][j]);
                    }
                  free(recordset[i]); 
                    i++;
                    printf("\n");
                }
                
                free(recordset);
                

                And can you elaborate below sentence:
                Do not free() something if you then go into it to access/free() something else.

                JonBJ 1 Reply Last reply
                0
                • Q Qt embedded developer

                  @JonB means i need to write code like below:

                  int i = 0;
                  
                  for (count = ncol; count < ((nrow + 1) * ncol); count++) {
                  
                      printf("Enter in LOOP\n");
                    
                      for (j = 0; j < ncol; j++) {
                          free(recordset[i][j]);
                      }
                    free(recordset[i]); 
                      i++;
                      printf("\n");
                  }
                  
                  free(recordset);
                  

                  And can you elaborate below sentence:
                  Do not free() something if you then go into it to access/free() something else.

                  JonBJ Offline
                  JonBJ Offline
                  JonB
                  wrote on last edited by
                  #14

                  @Qt-embedded-developer
                  In principle you at least now have the free()s in the right order.

                  I don't know why you have an i and a count, whether you go through the right items, and why you use (nrow + 1) (the + 1). But that's a coding issue for you to sort out. I have answered your questions, over to you to implement now.

                  Do not free() something if you then go into it to access/free() something else.

                  Exactly what I wrote; If you go e.g.

                  free(recordset);
                  free(recordset[i]);  // or anything to `recordset[i]`
                  

                  think about what state recordset[i] might be in after you have free()d recordset.

                  Q 1 Reply Last reply
                  1
                  • JonBJ JonB

                    @Qt-embedded-developer
                    In principle you at least now have the free()s in the right order.

                    I don't know why you have an i and a count, whether you go through the right items, and why you use (nrow + 1) (the + 1). But that's a coding issue for you to sort out. I have answered your questions, over to you to implement now.

                    Do not free() something if you then go into it to access/free() something else.

                    Exactly what I wrote; If you go e.g.

                    free(recordset);
                    free(recordset[i]);  // or anything to `recordset[i]`
                    

                    think about what state recordset[i] might be in after you have free()d recordset.

                    Q Offline
                    Q Offline
                    Qt embedded developer
                    wrote on last edited by
                    #15

                    @JonB said in i want to understand how dynamic memory allocation done for result of sqlite3_get_table with malloc ?:

                    over to you to implement now

                    Hi

                    here below i allocated memory for string element in array index
                    recordset[i][j] = (char *) malloc((strlen(result[count]) + 1));

                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      mpergand
                      wrote on last edited by mpergand
                      #16

                      Yeah good C exercise :)

                             int rows=2, cols=3;
                             const char* R1[]={"r1 c1","r1 c2","r1,c3"};
                             const char* R2[]={"r2 c1","r2 c2","r2,c3"};
                             const char** data[]={ R1,R2};
                                 
                             char*** recordset;  // array of pointers (rows) to array of pointers (cols)
                             recordset=(char***) malloc(sizeof(char***)*rows);
                             
                         	for (int r = 0; r < rows; ++r) 
                         		{
                         		recordset[r]=(char**) malloc(sizeof(char**)*cols);
                         		for (int c = 0; c < cols; ++c) 
                         			{
                         			recordset[r][c]=(char*) malloc(sizeof(char)*(strlen(data[r][c])+1));
                         			strcpy(recordset[r][c],data[r][c]);
                         			}
                         		}
                         
                         	for(int r=0 ; r<rows; r++)
                         		std::cout<<recordset[r][0]<<", "<<recordset[r][1]<<", "<<recordset[r][2]<<", "<<std::endl;
                         
                         	// delete
                         	for (int r = 0; r < rows; ++r) 
                         		{
                         		for (int c = 0; c < cols; ++c) 
                         			{
                         			free(recordset[r][c]);
                         			}
                         			
                         		free(recordset[r]);
                         		}
                         		
                         	free(recordset);
                      
                      JonBJ 1 Reply Last reply
                      0
                      • M mpergand

                        Yeah good C exercise :)

                               int rows=2, cols=3;
                               const char* R1[]={"r1 c1","r1 c2","r1,c3"};
                               const char* R2[]={"r2 c1","r2 c2","r2,c3"};
                               const char** data[]={ R1,R2};
                                   
                               char*** recordset;  // array of pointers (rows) to array of pointers (cols)
                               recordset=(char***) malloc(sizeof(char***)*rows);
                               
                           	for (int r = 0; r < rows; ++r) 
                           		{
                           		recordset[r]=(char**) malloc(sizeof(char**)*cols);
                           		for (int c = 0; c < cols; ++c) 
                           			{
                           			recordset[r][c]=(char*) malloc(sizeof(char)*(strlen(data[r][c])+1));
                           			strcpy(recordset[r][c],data[r][c]);
                           			}
                           		}
                           
                           	for(int r=0 ; r<rows; r++)
                           		std::cout<<recordset[r][0]<<", "<<recordset[r][1]<<", "<<recordset[r][2]<<", "<<std::endl;
                           
                           	// delete
                           	for (int r = 0; r < rows; ++r) 
                           		{
                           		for (int c = 0; c < cols; ++c) 
                           			{
                           			free(recordset[r][c]);
                           			}
                           			
                           		free(recordset[r]);
                           		}
                           		
                           	free(recordset);
                        
                        JonBJ Offline
                        JonBJ Offline
                        JonB
                        wrote on last edited by
                        #17

                        @mpergand said in i want to understand how dynamic memory allocation done for result of sqlite3_get_table with malloc ?:

                          	recordset[r][c]=(char*) malloc(sizeof(char*));
                          	strcpy(recordset[r][c],data[r][c]);
                        

                        Ummm, really...? ;-)

                        M 1 Reply Last reply
                        1
                        • JonBJ JonB

                          @mpergand said in i want to understand how dynamic memory allocation done for result of sqlite3_get_table with malloc ?:

                            	recordset[r][c]=(char*) malloc(sizeof(char*));
                            	strcpy(recordset[r][c],data[r][c]);
                          

                          Ummm, really...? ;-)

                          M Offline
                          M Offline
                          mpergand
                          wrote on last edited by
                          #18

                          @JonB
                          Bien vu ;)

                          1 Reply Last reply
                          1

                          • Login

                          • Login or register to search.
                          • First post
                            Last post
                          0
                          • Categories
                          • Recent
                          • Tags
                          • Popular
                          • Users
                          • Groups
                          • Search
                          • Get Qt Extensions
                          • Unsolved