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