C - 取消引用void指针

时间:2015-08-28 16:32:07

标签: c

我正在尝试创建自己的交换功能,但我遇到了麻烦。
为什么我得到“取消引用无效指针”?

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++;
    }
}

5 个答案:

答案 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++;
    }
}