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 Update on Monday, May 27th 2025

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 2.3k Views
  • 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.
  • Q Qt embedded developer
    7 Mar 2022, 11:04

    @JonB Yes i know that how to use malloc but what is logic behind memory allocation for result received from sqlite3_get_table ?

    recordset = (char ***) malloc(nrow * sizeof (char **));

    recordset[i] = (char **) malloc(ncol * sizeof (char *));

    recordset[i][j] = (char *) malloc((strlen(result[count]) + 1));

    J Offline
    J Offline
    JonB
    wrote on 7 Mar 2022, 11:08 last edited by JonB 3 Jul 2022, 11:11
    #4

    @Qt-embedded-developer
    Well you need to look up the documentation for sqlite3_get_table() to see what it says! At some level these are required to allocate the area of memory to which the later code is going to do the strcpy()s etc. from the result set returned.

    recordset = (char ***) malloc(nrow * sizeof (char **));    // space for `nrow`s of `char **`
    
    recordset[i] = (char **) malloc(ncol * sizeof (char *));    // space for `ncol`s of `char *`
    
    recordset[i][j] = (char *) malloc((strlen(result[count]) + 1));    // space for the length of a C string in `result[count]`, with its terminating '\0' byte
    
    Q 1 Reply Last reply 7 Mar 2022, 11:23
    1
    • J JonB
      7 Mar 2022, 11:08

      @Qt-embedded-developer
      Well you need to look up the documentation for sqlite3_get_table() to see what it says! At some level these are required to allocate the area of memory to which the later code is going to do the strcpy()s etc. from the result set returned.

      recordset = (char ***) malloc(nrow * sizeof (char **));    // space for `nrow`s of `char **`
      
      recordset[i] = (char **) malloc(ncol * sizeof (char *));    // space for `ncol`s of `char *`
      
      recordset[i][j] = (char *) malloc((strlen(result[count]) + 1));    // space for the length of a C string in `result[count]`, with its terminating '\0' byte
      
      Q Offline
      Q Offline
      Qt embedded developer
      wrote on 7 Mar 2022, 11:23 last edited by
      #5

      @JonB Sorry may be i am wrong and illogical. can you able tell me this logic is some what similar to 2d array like or 3d array of string like ?

      J 1 Reply Last reply 7 Mar 2022, 11:33
      0
      • Q Qt embedded developer
        7 Mar 2022, 11:23

        @JonB Sorry may be i am wrong and illogical. can you able tell me this logic is some what similar to 2d array like or 3d array of string like ?

        J Offline
        J Offline
        JonB
        wrote on 7 Mar 2022, 11:33 last edited by JonB 3 Jul 2022, 11:38
        #6

        @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 1 Reply Last reply 8 Mar 2022, 05:44
        3
        • J JonB
          7 Mar 2022, 11:33

          @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 8 Mar 2022, 05:44 last edited by
          #7

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

          J 1 Reply Last reply 8 Mar 2022, 10:39
          0
          • Q Qt embedded developer
            8 Mar 2022, 05:44

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

            J Offline
            J Offline
            JonB
            wrote on 8 Mar 2022, 10:39 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 8 Mar 2022, 14:13
            0
            • J JonB
              8 Mar 2022, 10:39

              @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 8 Mar 2022, 14:13 last edited by Qt embedded developer 3 Aug 2022, 14:17
              #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;
                 }
              
              J 1 Reply Last reply 8 Mar 2022, 14:33
              0
              • Q Qt embedded developer
                8 Mar 2022, 14:13

                @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;
                   }
                
                J Offline
                J Offline
                JonB
                wrote on 8 Mar 2022, 14:33 last edited by JonB 3 Aug 2022, 14:34
                #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 8 Mar 2022, 14:36
                0
                • J JonB
                  8 Mar 2022, 14:33

                  @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 8 Mar 2022, 14:36 last edited by Qt embedded developer 3 Aug 2022, 14:41
                  #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");
                  }
                  
                  J 1 Reply Last reply 8 Mar 2022, 14:51
                  0
                  • Q Qt embedded developer
                    8 Mar 2022, 14:36

                    @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");
                    }
                    
                    J Offline
                    J Offline
                    JonB
                    wrote on 8 Mar 2022, 14:51 last edited by JonB 3 Aug 2022, 14:52
                    #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 8 Mar 2022, 14:55
                    1
                    • J JonB
                      8 Mar 2022, 14:51

                      @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 8 Mar 2022, 14:55 last edited by Qt embedded developer 3 Aug 2022, 14:58
                      #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.

                      J 1 Reply Last reply 8 Mar 2022, 15:04
                      0
                      • Q Qt embedded developer
                        8 Mar 2022, 14:55

                        @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.

                        J Offline
                        J Offline
                        JonB
                        wrote on 8 Mar 2022, 15:04 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 9 Mar 2022, 05:20
                        1
                        • J JonB
                          8 Mar 2022, 15:04

                          @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 9 Mar 2022, 05:20 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 9 Mar 2022, 18:28 last edited by mpergand 3 Oct 2022, 08:53
                            #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);
                            
                            J 1 Reply Last reply 9 Mar 2022, 18:35
                            0
                            • M mpergand
                              9 Mar 2022, 18:28

                              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);
                              
                              J Offline
                              J Offline
                              JonB
                              wrote on 9 Mar 2022, 18:35 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 9 Mar 2022, 18:40
                              1
                              • J JonB
                                9 Mar 2022, 18:35

                                @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 9 Mar 2022, 18:40 last edited by
                                #18

                                @JonB
                                Bien vu ;)

                                1 Reply Last reply
                                1

                                13/18

                                8 Mar 2022, 14:55

                                • Login

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