c - 通过双指针访问数组,丢失其主体,纯 C

标签 c arrays sorting double-pointer

当我试图对我通过双指针引用的数组内容进行排序时。

http://ideone.com/OapPh

第 77 行

SortQuick(&(*data_resource)->data,
   &(*data_resource)->low,
   &(*data_resource)->length - 1);

内容还没有排序,通过同样的方法我用函数 ArrayPrint()

打印这个数组的值非常好

此代码在 MS C++ 编译器上编译良好,关于 GCC 不知道。 代码中没有任何警告或错误,MS 编译器不会通过标准配置显示它。

最佳答案

这不是排序,因为 &(*data_resource)->length - 1 的计算结果为 &(*data_resource)->low

&(*data_resource)->length 是指向 int 的指针。当您从中减去 1 时,它指向之前的 int 并且恰好是 &(*data_resource)->low 因为您恰好在此定义了结构成员顺序:

typedef struct Resource
{
        int low;
        int length;
        int *data;
} Resource;

因此,您的排序代码获得了 2 个相同的索引,并且正确地不对任何内容进行排序,因为在仅由一个元素组成的子数组中没有任何内容可排序。

这是一个稍微修改过的版本:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Resource
{
        int low;
        int length;
        int *data;
} Resource;

void Swap(int *first, int *second)
{
        int tmp = *first;
        *first = *second;
        *second = tmp;
}

void SortQuick(int **data, int *low, int *high)
{
        int i = *low,
                j = *high,
                x = (*data)[(*low + *high) / 2];

        do
        {
                while((*data)[i] < x) i++;
                while((*data)[j] > x) j--;

                if(i <= j)
                {
                        Swap(&(*data)[i], &(*data)[j]);
                        i++;
                        j--;
                }

        } while(i <= j);

        if(i < *high) SortQuick(data, &i, high);
        if(*low < j) SortQuick(data, low, &j);
}

void ArrayPrint(int **data, int *array_length)
{
        for(int i = 0; i < *array_length; i++)
        {
                printf("[%i]: %20i\r\n", i, (*data)[i]);
        }
}

void ArrayInit(int **data, int *array_length)
{
        (*data) = (int*)malloc(sizeof(int) * *array_length);

        for(int i = 0; i < *array_length; i++)
        {
                (*data)[i] = rand();
        }
}

int GlobalInit(Resource **data_resource)
{
        srand((unsigned int)rand());

        *data_resource = (Resource*)malloc(sizeof(Resource));
        (*data_resource)->low = 0;
        (*data_resource)->length = 10;//rand();

        ArrayInit(&(*data_resource)->data, &(*data_resource)->length);

        return (*data_resource)->length;
}

void BenchmarkTest(Resource **data_resource)
{
        ArrayPrint(&(*data_resource)->data, &(*data_resource)->length);
        (*data_resource)->length--;
        SortQuick(&(*data_resource)->data, &(*data_resource)->low, &(*data_resource)->length);
        (*data_resource)->length++;
        ArrayPrint(&(*data_resource)->data, &(*data_resource)->length);
}

int main(void)
{
        Resource *data_resource = NULL;

        GlobalInit(&data_resource);
        BenchmarkTest(&data_resource);

        return 0;
}

输出(ideone):

[0]:           1362961854
[1]:              8891098
[2]:            392263175
[3]:            158428306
[4]:           2074436122
[5]:             47170999
[6]:            431826012
[7]:           1599373168
[8]:           1769073836
[9]:           1043058022
[0]:              8891098
[1]:             47170999
[2]:            158428306
[3]:            392263175
[4]:            431826012
[5]:           1043058022
[6]:           1362961854
[7]:           1599373168
[8]:           1769073836
[9]:           2074436122

关于c - 通过双指针访问数组,丢失其主体,纯 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12367758/

相关文章:

编译器不允许在 C 中使用 exit() 函数

arrays - F# Array 用 5 个项目实例化,但不是用 6 个项目实例化

java - 如何使用 List<Object> 将对象值设置为 java 中的模型类?

c++ - 在合并排序算法中,合并数组后释放左右子数组会对空间复杂度产生任何影响吗?

c - 从 txt 文件中读取数字矩阵

c - 我对 fgets() 和 strtok() 的使用对于解析多行输入是否不正确?

c - 当数组大小和整数大小不恒定时,如何创建整数数组?

在 CUDA 中按键对(小)数组进行排序

javascript - React 过滤器最佳实践

c - 发送()问题