我一直在努力理解为什么在运行用C语言编写的程序时会出现“SEGMENTATION FAULT”。
我试过gdb。
这是我收到的信息:
Program received signal SIGSEGV, Segmentation fault.
0x0016e5e0 in mysql_slave_send_query () from /usr/lib/libmysqlclient.so.16
(gdb) step
Single stepping until exit from function mysql_slave_send_query,
which has no line number information.
Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
事实是我没有得到编译器错误/警告消息但该程序不起作用 正常。
任何人都可以帮助我吗?
我的查询是:
char query[512];
sprintf(query, "SELECT t1.Art_Acquisto as 'Cod',t2.Des_Articolo as 'Descrizione',t4.Cod_Categoria as 'Cat.',t1.Data_Acquisto as" "'data',t1.Netto_Acquisto as'Importo',t3.Des_Fornitore as 'Fornitore' from "
"Aquisti as t1, Articoli as t2, Fornitori as t3, Categorie as t4 where t1.Art_Acquisto = t2.Cod_Articolo and "
"t1.fornitoreM = t3.codiceF and t4.codiceC = t2.categoriaA and Art_Acquisto ='%s'order by Data_Acquisto;",Cod_Articolo);
答案 0 :(得分:2)
检查你的mysql_slave_send_query的参数,特别是其他参数的长度和正确的初始化/分配。
答案 1 :(得分:0)
“分段错误”表示您的程序在执行名为mysql_slave_send_query的函数期间访问了无效的内存位置。 因此,这意味着您的C程序中存在错误。
答案 2 :(得分:0)
Cod_Articolo
的内容有多大?您的查询将近400个字符,并且您存储的缓冲区只有512个字符 - 如果Cod_Articolo
超过110个字符,则代码将中断。
如果这是问题,您可以通过在将Cod_Articolo
写入查询字符串之前检查sprintf
的大小来阻止它。更好的是,您可以计算查询字符串所需的大小,并分配恰当的数量。
使用snprintf
代替{{1}}也是一种好习惯,因为您可以确保不会将太多字符复制到目标字符串中。