我正在使用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之前不會拋出任何錯誤。 –