columnNames[i] = malloc(strlen(buffer) + 1);

Need to deal with that pesky '\0'!

-----Original Message-----
From: sqlite-users-boun...@sqlite.org [mailto:sqlite-users-boun...@sqlite.org] 
On Behalf Of Stephen Wood
Sent: Thursday, May 31, 2012 11:47 AM
To: sqlite-users@sqlite.org
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
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to