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