【问题标题】:assignment and comparison pointers in cc中的赋值和比较指针
【发布时间】:2018-04-13 03:36:12
【问题描述】:

我的分区函数出现错误,内容如下:

assignment makes integer from pointer without a cast 
v= array[low]; 

comparison between pointer and integer [-Werror]

这些是我在整个分区函数中遇到的错误。请帮忙。

void quickSort(void *array[], int low, int high)
{
    int p;
    if(low < high)
    {
        p= partition(*array, low, high);
        quickSort(array, low, p-1);
        quickSort(array, p+1, high);
    }
} 

int partition(void *array[], int low, int high)
{
    int v, i, j, temp;
    v= array[low];
    i=low;
    j=high+1;
    do
    {
        do 
            i++;
        while(array[i]<v && i <=high);
        do 
            j--;
        while(v<array[j]);

        if(i<j)
        {
            temp =array[i];
            array[i] = array[j];
            array[j] = temp;
        }
    }while(i<j);

    array[low] = array[high];
    array[high] = v;

    return(j);
} 

【问题讨论】:

  • array 是指向void 的指针数组。通过将指向 void 的指针分配给整数,您期望得到什么?
  • int partition(void *array[], int low, int high); { 不是有效代码。贴出真实代码及其用途。
  • 你的意思是它不是真正的代码?那是给我的原型,我不能改变它。

标签: c pointers function-pointers void void-pointers


【解决方案1】:

array是一个指针数组,所以array[low]是一个指针;您无法将其与v 中的整数进行有意义的比较。您需要取消引用指针以获取值。要以int 的身份访问它们,您需要转换指针类型。

v = *(int*)array[low];

array 的所有其他用法都需要进行类似修改,例如

while (*(int*)array[i] < v && i <= high)

【讨论】:

    【解决方案2】:

    赋值从没有强制转换的指针中生成整数

    来自v= array[low];这一行

    这是因为array 是void 指针的数组(即array[low] 也是voidpointer)而v 是int。所以看看你正在做的类型

    int = void*
    

    正如错误所说 - 你有一个指针(空指针)并从指针中生成一个 int 。这是违法的。

    指针与整数的比较[-Werror]

    来自以下几行:

    while(array[i]<v && i <=high);
    ....
    while(v<array[j]);
    

    原因和上面描述的一样——你把int类型和指针类型混合在一起。

    我不确定您应该如何解决,但也许该数组应该被转换为 int 并取消引用。喜欢

    v= array[low];  ---->  v= *((int*)array[low]);
                                |^^^^^^^^^^^^^^|
                                  cast void* to get an int*
                              |-----------------|
                               Dereference the int* to get an int
    

    两个while 语句类似。

    也就是说,我在你的代码中看到了其他对我来说看起来很奇怪的东西。

    例如:

    array[high] = v;
    

    我不确定你在这里尝试什么,但再次出现类型不匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-01
      • 1970-01-01
      • 2014-11-03
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      相关资源
      最近更新 更多