当前位置: 技术问答>php安装完成后如何添加mysql扩展
iis7站长之家
用mysql c api出现段错误问题,莫名其妙!高分求解
来源: 互联网 发布时间:2016-05-24
本文导语: 我发现用mysql c api会有些莫名奇妙的错误,程序出现段错误后退出.应该不是程序的问题.各位有没遇到过? 程序大概这样,简化了的. void * process_test(void *arg) { MYSQL tspsql; char username[25]] = {0}; char passwd[255] =...
我发现用mysql c api会有些莫名奇妙的错误,程序出现段错误后退出.应该不是程序的问题.各位有没遇到过?
程序大概这样,简化了的.
void *
process_test(void *arg)
{
MYSQL tspsql;
char username[25]] = {0};
char passwd[255] = {0};
Pthread_detach(pthread_self());
my_init();
mysql_thread_init();
mysql_init(&tspsql);
mysql_options(&tspsql,MYSQL_READ_DEFAULT_GROUP,"tspserver");
if (!mysql_real_connect(&tspsql,"localhost","test","test","test",0,NULL,0))
perror("Failed to connect to database!");
/*这里是取username部分,我用了多种方式取,各种结果都是一样的。但即使这样,不同的方式取username,却会影响下面的运算.
按道理,下面是会循环执行的.但根据我的不同取username方式,有的运行到第2次,就出现段错误退出了.莫名奇妙.不知道
明白我说的吗?呵呵*/
for(;;)
getpasswd(&tspsql,username,passwd);
return(NULL);
}
int getpasswd(MYSQL *tsql,const char* username,char* passwd)
{
int plen;
char sql[255] = {0};
MYSQL_ROW row;
MYSQL_RES *result;
sprintf(sql,"select * from user where username = "%s" limit 1", username);
if(mysql_query(tsql,sql) != 0)
return -1;
if((result = mysql_store_result(tsql)) == NULL)
return -1;
if((row = mysql_fetch_row(result)) == NULL)
return -1;
plen = strlen(row[2]);
memcpy(passwd,row[2],plen);
passwd[plen] = 0;
mysql_free_result(result);
return 0;
}
程序大概这样,简化了的.
void *
process_test(void *arg)
{
MYSQL tspsql;
char username[25]] = {0};
char passwd[255] = {0};
Pthread_detach(pthread_self());
my_init();
mysql_thread_init();
mysql_init(&tspsql);
mysql_options(&tspsql,MYSQL_READ_DEFAULT_GROUP,"tspserver");
if (!mysql_real_connect(&tspsql,"localhost","test","test","test",0,NULL,0))
perror("Failed to connect to database!");
/*这里是取username部分,我用了多种方式取,各种结果都是一样的。但即使这样,不同的方式取username,却会影响下面的运算.
按道理,下面是会循环执行的.但根据我的不同取username方式,有的运行到第2次,就出现段错误退出了.莫名奇妙.不知道
明白我说的吗?呵呵*/
for(;;)
getpasswd(&tspsql,username,passwd);
return(NULL);
}
int getpasswd(MYSQL *tsql,const char* username,char* passwd)
{
int plen;
char sql[255] = {0};
MYSQL_ROW row;
MYSQL_RES *result;
sprintf(sql,"select * from user where username = "%s" limit 1", username);
if(mysql_query(tsql,sql) != 0)
return -1;
if((result = mysql_store_result(tsql)) == NULL)
return -1;
if((row = mysql_fetch_row(result)) == NULL)
return -1;
plen = strlen(row[2]);
memcpy(passwd,row[2],plen);
passwd[plen] = 0;
mysql_free_result(result);
return 0;
}
|
plen = strlen(row[2]);
memcpy(passwd,row[2],plen);
这里很有可能造成core
另外,少用sprintf, 一不留神,就会core
memcpy(passwd,row[2],plen);
这里很有可能造成core
另外,少用sprintf, 一不留神,就会core
|
up先
|
如果说调用api时发生段错误,那么很可能是参数的初始化值不正确,该分配内存的没有分配、指针可能是一个实效的指针等等。
|
呵呵,这种事情也很正常,包括操作系统也这样。这也难怪,某些大型的外企公司的软件,800客服一般上来就问,版本啊、patch啊,甚至操作系统的版本也要问。