我正在尝试创建自己的交换功能,但我遇到了麻烦。
为什么我得到“取消引用无效指针”?
void ft_swap(void *a, void *b, size_t nbytes)
{
unsigned char *cur_a;
unsigned char *cur_b;
size_t i;
i = 0;
while (i < nbytes)
{
cur_a = (unsigned char *)*a + i; // here
cur_b = (unsigned char *)*b + i; // here
*a = cur_b;
*b = cur_a;
i++;
}
}
答案 0 :(得分:2)
您希望将(abstract)void*
指针强制转换为指向unsigned char
的指针,以便代码:
cur_a = (unsigned char *)a + i;
您的代码被理解为cur_a = (unsigned char *)(*a) + i;
错误地取消引用void*
抽象指针。
*a = cur_b;
也没有意义。也许你想要
((unsigned char*)a)[i] = cur_b;
答案 1 :(得分:2)
因为你要取消引用void指针:
$unitprice = 0.01;
执行 <form id="paypal_form" class="paypal" action="payments.php" method="post" target="_blank">
<input type="hidden" name="cmd" value="_xclick" />
<input type="hidden" name="unitprice" value="0.01" />
<input type="hidden" name="no_note" value=""/>
<input type="hidden" name="lc" value="MT" />
<input type="hidden" name="currency_code" value="EUR" />
<input type="hidden" name="bn" value="BuyNowBF:btn_buynow_LG.gif:NonHostedGuest" />
<input type="text" name="first_name" value=""/>
<input type="text" name="last_name" value=""/>
<select name="quantity">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<input type="text" name="payer_email" value="" />
<input type="hidden" name="item_number" value="123456"/>
<input type="submit" value="Submit Payment" />
</form>
</body>
</html>
意味着您首先取消引用<?php
$host = "localhost";
$user = "root";
$pass = "";
$db_name = "paypal_test";
// paypal settings
$paypal_email = 'my email address';
$return_url = 'http://localhost/Webdevelopment/V18/paypal/success.html';
$cancel_url = 'http://localhost/Webdevelopment/V18/paypal/cancel.html';
$notify_url = 'http://localhost/Webdevelopment/V18/paypal/payments.php';
$item_name = "An Item";
$unitprice = isset($_POST['unitprice']); (0.01)
$quantity = isset($_POST['quantity']);
$item_amount = $unitprice * $quantity;
echo $item_amount;
// include functions
include ("functions.php");
...
,然后将结果(无论是什么,解除引用void ft_swap(void *a, void *b, size_t nbytes)
{
...
cur_a = (unsigned char *)*a + i; // here
cur_b = (unsigned char *)*b + i; // here
没有多大意义)转换为指向{{1 }}。做
*a
更有意义。
答案 2 :(得分:1)
不允许取消引用void指针。您需要将其强制转换为另一种指针类型:
cur_a = (unsigned char *)a;
同样,您无法为*a
分配任何内容。正确的代码是:
void ft_swap(void *a, void *b, size_t nbytes) {
unsigned char *cur_a = (unsigned char *) a;
unsigned char *cur_b = (unsigned char *) b;
for (size_t i = 0; i < nbytes; ++i) {
unsigned char tmp = cur_a[i];
cur_a[i] = cur_b[i];
cur_b[i] = tmp;
}
}
答案 3 :(得分:0)
__init__.py
在行中:
six.py
您也取消引用 cur_a = (unsigned char *)*a + i; // here
^^^ that is dereferencing a void*
cur_b = (unsigned char *)*b + i; // here
^^^ that is dereferencing a void* also.
。
这是我修复功能的建议:
*a = cur_b;
*b = cur_a;
答案 4 :(得分:0)
查看你的陈述
cur_a = (unsigned char *)*a + i; // here
如果a
是指向void(void *a
)然后*a = void
的指针。然后子表达式(unsigned char *)*a
意味着您要将void
强制转换为指向char的指针。
但void
表示C中的'不存在类型',由此产生错误。
您可能会问为什么指向void的指针有意义,因为它是一个地址,这是C中的有效数据类型。您可以将该地址用于不涉及指向类型的所有操作。即将地址分配给指向任何类型数据的指针,反之亦然。像a[2]
这样的表达式是非法的,其中下标运算符[]
需要指向的数据大小来计算检索值的地址。当然void
,作为伪造的类型,没有大小(与错过许多其他属性的方式相同)。
说我会断定你的代码只是一个错误,而你真正想做的是:
void ft_swap(void *a, void *b, size_t nbytes)
{
unsigned char cur_a; //value not pointers
unsigned char cur_b;
size_t i;
i = 0;
while (i < nbytes)
{
cur_a = *((unsigned char *)a + i); // here
cur_b = *((unsigned char *)b + i); // here
*a = cur_b;
*b = cur_a;
i++;
}
}