LINUX.ORG.RU

[C][строки][указатели] непонятки

 , ,


0

0

Доброе время суток!

Оказался в странной ситуации.. есть кусок кода

char *que;
while((tblrow = mysql_fetch_row(tblres)))
{
  sprintf(que,"describe %s",tblrow[0]);
  que=(char*)malloc((9+strlen(tblrow[0]))*sizeof(char));
  sprintf(que,"describe %s",tblrow[0]);
  	
  mysql_query(&base,que);
  colres=mysql_store_result(&base);

  while((colrow=mysql_fetch_row(colres)))
  {
  }
}
Если использовать такой код-прога сегфолтится, если вместо вместо переменной в mysql_query передавать, например «describe users» , то работает нормально...

Соответственно есть подозрение на то что я или ошибся в выделении памяти или у tblrow[0] нет в конце символа конца строки, но как узнать колличество символов в этой переменной... Хотя возможно ошибка в чем-то еще...

Подскажите пожалуйста, а то уже кучу вариантов перепробовал-сегфолтится...

Ой вей, сначала забиваешь строку а потом под нее выделаешь память, попробуй делать наоборот.

wfrr ★★☆
()

>  sprintf(que,"describe %s",tblrow[0]);
>  que=(char*)malloc((9+strlen(tblrow[0]))*sizeof(char));
>  sprintf(que,"describe %s",tblrow[0]);

Память нужно выделить уже перед первым sprintf

> que=(char*)malloc((9+strlen(tblrow[0]))*sizeof(char));

Не 9, а 10, ещё один на ноль в конце. strlen его не учитывает.

> sizeof(char)

Не нужно. По стандарту это всегда 1.

Jini ★★
()

> Если использовать такой код-прога сегфолтится, если вместо вместо переменной в mysql_query передавать, например "describe users" , то работает нормально...

Гонево, или код ты совсем не тот, что компилишь дал

char *que;
...говнокод...
sprintf(que,"describe %s",tblrow[0]); //тут рухнуло, бо под que память не выделил
que=(char*)malloc((9+strlen(tblrow[0]))*sizeof(char)); //тут за каким-то хером память выделяешь, но мы уже кору дампим


Короче, код твой - упоротый, криво ты его скопипастил. А падает - ты спринтфишь в указатель, который кажет хер знает куда. char que[666] = {0}; спасет же.

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

скопипастил реально криво, прошу прощения,но
ни
que=(char*)malloc(10+strlen(tblrow[0]));
sprintf(que,"describe %s",tblrow[0]);
ни
char que[300]={0};
а потом
sprintf(que,"describe %s",tblrow[0]);
не работает

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

>Гонево, или код ты совсем не тот, что компилишь дал

Код тот, только без ГТК ф-ций, которые строят дерево из списка таблиц и колонок в таблицах...

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

Бгг, NULL values in the row are indicated by NULL pointers - забавная штука, этот МойСКЛ.

nikolayd
()
Ответ на: комментарий от motofan

> que=(char*)malloc(10+strlen(tblrow[0])); > sprintf(que,"describe %s",tblrow[0]);

WTF is tblrow? Разберись-ка с этим, да. Ну и чего там находится.

anonymous
()

facepalm.c

Кто память под que освобождать будет например? Или это опущено? И делать ненужные malloc'и - это же пиздец.

char que[128] например, а sprintf меняем на snprintf(que, sizeof(que)...

Дальше не смотрел, аффтару учить отличия C от ПХП.

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

> Кто память под que освобождать будет например? Или это опущено? И делать ненужные malloc'и - это же пиздец.

char que[128] например,...

Данный пример верен, но в тех случаях, когда есть уверенность, что за пределы выделенной памяти в стеке никогда не будет превышен. ;))) Поэтому, malloc(), а вернее calloc() будет здесь уместен.

А c free() тут не ясно, потому что que может быть указателем, которая возвращает функция, а данный пример всего лишь ее фрагмент.

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

> char que[128] например,...
> Данный пример верен, но в тех случаях, когда есть уверенность, что за пределы выделенной памяти в стеке никогда не будет превышен. ;)))


Мужик же написал, что надо использовать snprintf! Опять не читаем?!

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