Thank you! I can't believe I missed that!

On Thu, May 31, 2012 at 10:50 AM, Marc L. Allen <[email protected]
> wrote:

>        columnNames[i] = malloc(strlen(buffer) + 1);
>
> Need to deal with that pesky '\0'!
>
> -----Original Message-----
> From: [email protected] [mailto:
> [email protected]] On Behalf Of Stephen Wood
> Sent: Thursday, May 31, 2012 11:47 AM
> To: [email protected]
> Subject: [sqlite] Segmentation Fault when calling sqlite3_finalize
>
> Hello all,
> I'm having some memory allocation difficulties while using the SQLite C
> API. The goal of the function that is currently giving me issues is just
> trying to read the column names from a table. I have been having other
> memory allocation faults elsewhere, but I currently have it isolated to
> this particular section of code (I say this because I suppose the root
> problem could be elsewhere in my code). Also strangely enough, if I do not
> store the data returned from sqlite3_column_name, but instead just print it
> to stdout, I do not get a segmentation fault, which also leads to me
> thinking my error may be more fundamental... This function is also run
> multiple times and only produces segmentation faults on the third table I
> run it on. I am using the database here<
> http://download.codeplex.com/Download/Release?ProjectName=chinookdatabase&DownloadId=167067&FileTime=129342699263670000&Build=18924
> >for
> testing.
>
> Please let me know if I can provide any more relevant information.
>
> Any help would be greatly appreciated. Below is the relevant code segment.
> Thanks!
>
> char **getColumnNames(char **columnNames, sqlite3 *database, char
> *tableName) {
>    sqlite3_stmt *statement = NULL;
>    char sqlStatementString[100];
>    char *sqlErrorMessage = 0;
>    char buffer[100];
>    int status = 0;
>    int i = 0;
>    int numOfCols = 0;
>
>    // Prepare a statement to get the tables from the database
> sprintf(sqlStatementString, "SELECT * FROM '%s';", tableName);
>    status = sqlite3_prepare_v2(database, sqlStatementString,
> strlen(sqlStatementString), &statement, NULL);
>    if (status != SQLITE_OK) {
>        fprintf(stderr, "Error occured when attempting to prepare an SQL
> statement\n"
>                        "Error:%s\n", sqlErrorMessage);
>        // Prevents memory leaking from error message:
>        sqlite3_free(sqlErrorMessage);
>        exit(1);
>    } // end error check
>
>    // I only want the first row, because I am only getting the names
>    // for the columns. This is why I only run the step function once
>    if (sqlite3_step(statement) != SQLITE_ROW) {
>        fprintf(stderr, "Either an error occured or table \"%s\" has no
> data!\n", tableName);
>        exit(1);
>    }
>
>    numOfCols = sqlite3_column_count(statement);
>    if (numOfCols < 1) {
>        perror("No columns in that table!\n");
>        exit(1);
>    }
>
>    columnNames = (char **) malloc(numOfCols * sizeof(char *));
>    if (columnNames == NULL) {
>        perror("Allocation error: ");
>        exit(1);
>    } // end error check for malloc
>
>    for (i = 0; i < numOfCols; i++) {
>        sprintf(buffer,  "%s", (char *) sqlite3_column_name(statement, i));
>
>        columnNames[i] = malloc(strlen(buffer));
>        if (columnNames[i] == NULL) {
>            perror("Failed to allocate memory for a column name\n");
>            exit(1);
>        } // end malloc error check
>
>        strcpy(columnNames[i], buffer);
>    } // end column loop
>
>    // Destroy the statement
>    // ******** THIS IS WHERE I GET THE SEGMENTATION FAULT **********
>    status = sqlite3_finalize(statement);
>    if (status != SQLITE_OK) {
>        fprintf(stderr, "Error occured when attempting to destroy a SQL
> statement\n"
>                        "Error:%s\n", sqlErrorMessage);
>        // Prevents memory leaking from error message:
>        sqlite3_free(sqlErrorMessage);
>        exit(1);
>    } // end error check
>
>    return columnNames;
>    } // end of function
>
>
> --
> Stephen Wood
> RMCI, INC.
> 1525 Perimeter Parkway
> Suite 430
> Huntsville, AL  35806**
> **
> _______________________________________________
> sqlite-users mailing list
> [email protected]
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
> _______________________________________________
> sqlite-users mailing list
> [email protected]
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>



-- 
Stephen Wood
RMCI, INC.
1525 Perimeter Parkway
Suite 430
Huntsville, AL  35806**
**
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to