LINUX.ORG.RU

Ошибка сегментирования (core dumped)


0

1

вылазит при запуске (компиляция проходит успешно)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "mysql.h"

#define DbHost "localhost"
#define DbUser "user"
#define DbPassword "test"
#define DbName "test"

MYSQL mysql;

int main()
{
    int manager=32;
    int result;
    char* query;

    mysql_init(&mysql);
    mysql_real_connect(&mysql, DbHost, DbUser, DbPassword, DbName, 0, NULL, 0);

//    sprintf(query, "select firms.title, notes.type, DATE_FORMAT(notes.date, '%%T') from notes join firms on (notes.kod=firms.kod) where notes.manager=%d", manager);

    sprintf(query, "manager=%d", manager);

    result = mysql_query(&mysql, query);

    printf("\nres=%d\n", result);

    mysql_close(&mysql);
}
команда компилятору: cc -I/usr/include/mysql -L/usr/lib/mysql 1.cpp -o myapp -lm -lmysqlclient

Ошибка вываливается при sprintf (закоментированная строка тоже вызывала ошибку, думал, что выхожу за предела массива, но второй sprintf ведет себя аналогично).

Под Linux на С++ пишу код/компилирую впервые, не судите строго. Что может быть?


это сегфолт, батюшка.

а выделять вам память под строку кто будет, пушкин?

ckotinko ☆☆☆
()
asprintf(&query, "manager=%d", manager);

...

free(query);

или query = calloc(тут считаем длину строки + 1 для '\0', sizeof(char)) перед использованием query.

quasimoto ★★★★
()

компиляция проходит успешно

$ gcc -Wall dg.c
...
... «query» is used uninitialized in this function [-Wuninitialized]
quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

оуч! Спасибо всем. После Borland C++ из под винды, как-то забыл, что память под все выделять нужно)

RJ45
() автор топика
Ответ на: комментарий от RJ45

память под все выделять нужно

Если писать прямо на C++, то будет примерно так

    int manager = 32;
    std::string query = "manager=" + xtos(manager);
    int result = mysql_query(&mysql, query.str().c_str());
    //           mysql.query(query.str());
    std::cout << std::endl << "res=" << result << std::endl;

template <typename T> std::string xtos(T x)
{
    std::stringstream s;
    s << x;
    return s.str();
}

без необходимости следить за памятью по части string (там выделение/освобождение памяти в конструкторах/деструкторах).

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto
-    int result = mysql_query(&mysql, query.str().c_str());
-    //           mysql.query(query.str());
+    int result = mysql_query(&mysql, query.c_str());
+    //           mysql.query(query);
quasimoto ★★★★
()

Тут одно из трех: 1. Либо вы впервые видите С 2. Либо я его путаю с Python 3. Либо query надо для начала инициализировать( выделить память malloc`ом ), либо определить как char query[100500]

Dikar ★★
()
Ответ на: комментарий от Boy_from_Jungle

в билдере встроенный строковый велосипед

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.