我正在使用MySQL C API并尝试执行准备好的语句来删除一行。由于使用&而不是*
-(void) deleteOne:(int) num
{
[self initAndConnectSql];
char copy[30] = "call delete";
strncat(copy, _name, 15);
strncat(copy, "(?)", 4);
MYSQL_STMT * prepared = mysql_stmt_init(&_mysql);
mysql_stmt_prepare(prepared, copy, strlen(copy));
MYSQL_BIND bind[1];
bind[0].buffer_type = MYSQL_TYPE_LONG;
bind[0].buffer = #
bind[0].is_null=0;
bind[0].length= 0;
if (mysql_stmt_bind_param(prepared, bind))
{
printf("error in binding params");
exit(1);
}
if (mysql_stmt_execute(prepared))
{
printf("Error executing prepared statement");
exit(1);
}
mysql_stmt_close(prepared);
mysql_close(&_mysql);
}
此代码正常工作。但是,以前当我没有将准备变量设置为指针时,我得到一个指针被释放,没有分配在malloc_error_break中设置断点来调试错误。该行是MYSQL_STMT prepared = *mysql_stmt_init(&_mysql);
。 我的问题是为什么设置准备作为一个指针,而不是传递在&准备在需要的地方工作?一个指针和一个&不应该是等价的,因为一个指针存储它指向的地址,而&返回地址,所以对于一个函数来说,它们是相同的?
'mysql_stmt_init'返回的类型是什么? “MYSQL_STMT”和“MYSQL_STMT *”类型有所不同吗?回答这两个问题是否回答你的问题? – dho
在需要求助于运行调试器之前,您应该已经获得了类型不匹配的编译器警告。您是否由于某种原因禁用了警告? –
我没有。编译器没有发出任何警告。 init函数返回一个指向MYSQL_stmt结构的指针。事实上,编译器实际上建议我在函数前面插入*而不是准备好,并且在执行到达stmt_close之前不会抛出任何错误。 –