C- 对指向可以为正数或负数的整数的指针数组进行排序

标签 c arrays sorting pointers

对于类,我需要生成一个包含 100 个介于最小值和最大值之间的整数的数组(现在可以正常工作),然后在一个单独的函数中,创建一个指针数组并按升序对其进行排序。

int *ptr 是指向原始数组的指针,头中SIZE定义为100

void sort(int *ptr){
    int *sortAr[SIZE] = { NULL };
    int i = 0, j, swap;
    for (i = 0; i < SIZE; i++)
        sortAr[i] = ptr[i];
    for (i = 0; i < (SIZE - 1); i++)
    {
        for (j = 0; j < SIZE - i - 1; j++)
        {
            if (sortAr[j] > sortAr[j + 1])
            {
                swap = sortAr[j];
                sortAr[j] = sortAr[j + 1];
                sortAr[j + 1] = swap;
            }
        }
    }
    int z = 0;
    for (z = 0; z < SIZE; z++)
        printf("%d\t", sortAr[z]);
}

当原始数组中的所有整数都是正数或负数时,我使用的代码工作正常,但是当存在混合时,它将对数组进行排序以包含按升序排列的正数,然后包含所有负数升序。例如:

4       10      12      14      14      16      17      19      20      21
28      33      35      35      36      38      39      41      41      41
45      45      45      47      48      49      50      54      64      66
67      68      70      72      73      73      74      75      75      76
76      77      78      78      79      86      86      87      87      91
92      95      95      98      -100    -99     -92     -86     -86     -84
-82     -80     -78     -78     -76     -73     -73     -71     -70     -70
-69     -64     -63     -63     -58     -56     -53     -50     -49     -48
-44     -42     -36     -32     -30     -25     -24     -24     -21     -20
-20     -19     -17     -17     -10     -6      -5      -4      -3      -3

有什么想法吗?

最佳答案

你传入了一个原始的int数组,但是你把它复制成了一个int*数组。当您稍后比较它们时,您有未定义的行为,因为您不允许比较指针,除非它们属于来自单个分配的同一内存块。

实际发生的是指针在内部是unsigned,因此您的负值正在变成很大的正值。幸运的是,对于 printf 调用,该值被正确地转换回 int,因此很难看出您做了什么坏事(除非您阅读编译器的警告)。

改为像这样声明你的数组:

int sortAr[SIZE];

关于C- 对指向可以为正数或负数的整数的指针数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36414721/

相关文章:

c - C中 boolean 运算的结果是1还是0?

c++ - 合并3组数组

arrays - 调用中缺少参数标签 'combine:'

java - 使用 java 集合对 Person 的 ArrayList 进行排序

javascript对象,连接重复的键,同时保留多个值

转换为碱基会得到相反的输出。如何在没有strrev的情况下使其正确?

c - 如何使用 time(NULL) 和 while 循环而不是 sleep(N) 实现 N 秒计时器?

javascript - 类似于 google+ 相册 View 的动态图像排序和裁剪

C Makefile - 如何避免重复提及文件名

php - 将数组输入表 PHP