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.1k 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
    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 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 ?

    JonBJ 1 Reply Last reply
    0
    • Q Qt embedded developer

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

      JonBJ Offline
      JonBJ Offline
      JonB
      wrote on last edited by JonB
      #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
      3
      • 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