当我尝试对通过双指针引用的数组内容进行排序时。
第 77 行
SortQuick(&(*data_resource)->data,
&(*data_resource)->low,
&(*data_resource)->length - 1);
内容尚未排序,通过相同的方法我使用函数ArrayPrint()非常好地打印该数组的值
这段代码在 MS C++ 编译器上编译得很好,关于 GCC 不知道。代码中没有任何警告或错误,MS 编译器没有按标准配置显示。
当我尝试对通过双指针引用的数组内容进行排序时。
第 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
所有这些指针的引用和取消引用都让你发疯,在大多数情况下它们不是必需的,试试这个:
#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]: %i\r\n", i, data[i]);
}
}
void ArrayInit(Resource *data_resource)
{
data_resource->data = (int*)malloc(sizeof(int) * data_resource->length);
for(int i = 0; i < data_resource->length; i++)
{
data_resource->data[i] = rand();
}
}
Resource* GlobalInit()
{
Resource *data_resource;
srand((unsigned int)rand());
data_resource = (Resource*)malloc(sizeof(Resource));
data_resource->low = 0;
data_resource->length = rand();
ArrayInit(data_resource);
return data_resource;
}
void BenchmarkTest(Resource *data_resource)
{
ArrayPrint(data_resource->data, data_resource->length);
SortQuick(data_resource->data, data_resource->low, data_resource->length - 1);
ArrayPrint(data_resource->data, data_resource->length);
}
int main(void)
{
Resource *data_resource = NULL;
data_resource = GlobalInit();
BenchmarkTest(data_resource);
return 0;
}
这部分没有意义:
&(*data_resource)->length - 1);
您正在获取该length
字段的地址并减去 1。删除- 1
似乎使其工作。
此外,您过度使用指针。例如ArrayPrint
可以简单地是
void ArrayPrint(int *data, int array_length)
{
for(int i = 0; i < array_length; i++)
{
printf("[%i]: %i\r\n", i, data[i]);
}
}