user-0 提问: 动态内存冒泡排序问题。

回复:
user: user-0
content: 引用 6 楼 cfjtaishan 的回复:排序逻辑还有点问题，比如你是想从小到大排序，那么你输入时，可以考虑一种最坏的情况即输入的数是从大到小依次输入。这样看一下你的排序逻辑是否可行。 以下是冒泡排序逻辑供参考。虽然是动态申请的空间，你可以完全可以看成数组。 for (i = 0; i < n; i++)     {         for (j = 0; j < n - i - 1; j++)         {             if (*(p + j) > *(p + j + 1))//p[j] p[j+1]             {                 m = *(p + j);                 *(p + j) = *(p + j + 1);                 *(p + j + 1) = m;             }         }     } for (i = 0; i < n; i++)     {         for (j = 0; j < n - i - 1; j++)         {             if (p[j] > p[j+1])//p[j] p[j+1]             {                 m = p[j];                 p[j] = p[j+1];                 p[j+1] = m;             }         }     } 参考一下

user: user-1
content: 引用 4 楼 qq_30519247 的回复:[quote=引用 1 楼 jianwen0529 的回复:] 可以，但是麻烦了一些，需要解决以下问题： 1：判断输入数据结束，比如用一个数作为结束标志或者一行（即读取一行字符串）或发生流错误等方法 2：动态数组不是很适用，因为个数未知，那么就不知道应该分配多大的内存（虽然有办法解决）。更好的方法是用链表实现 晓得了，感觉能解决也很麻烦。。[/quote] 这个也不是很麻烦，判断scanf_s的返回值，这是第一步，然后在scanf_s返回正确时，在判断n的值，若输入的n大于你设定的值，可以让用户继续输入。 通过判断scanf_s的返回值，可以判定输入的数是正确的，还是非数字，比如字符串等等

user: user-0
content: 引用 7 楼 cfjtaishan 的回复:[quote=引用 4 楼 qq_30519247 的回复:] [quote=引用 1 楼 jianwen0529 的回复:] 可以，但是麻烦了一些，需要解决以下问题： 1：判断输入数据结束，比如用一个数作为结束标志或者一行（即读取一行字符串）或发生流错误等方法 2：动态数组不是很适用，因为个数未知，那么就不知道应该分配多大的内存（虽然有办法解决）。更好的方法是用链表实现 晓得了，感觉能解决也很麻烦。。[/quote] 这个也不是很麻烦，判断scanf_s的返回值，这是第一步，然后在scanf_s返回正确时，在判断n的值，若输入的n大于你设定的值，可以让用户继续输入。 通过判断scanf_s的返回值，可以判定输入的数是正确的，还是非数字，比如字符串等等[/quote] 还是不怎么懂、、、、、

user: user-0
content: 引用 1 楼 jianwen0529 的回复:可以，但是麻烦了一些，需要解决以下问题： 1：判断输入数据结束，比如用一个数作为结束标志或者一行（即读取一行字符串）或发生流错误等方法 2：动态数组不是很适用，因为个数未知，那么就不知道应该分配多大的内存（虽然有办法解决）。更好的方法是用链表实现 晓得了，感觉能解决也很麻烦。。

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:p = (int *)malloc(n);     if (p == 0)     {         printf("内存分配失败！\n");         exit(1);//失败的时候终止程序     } 这部分有问题呢。 p是int类型指针，malloc后面跟的申请的字节数，根据你的代码逻辑，申请的n应该是n个int类型的数，而不是n个字节。注意n个字节和n个int类型的空间是有差距的，相差（n-1） * sizeof(int)个字节呢 所以，这部分要改一下，如下： p = (int *)malloc(n *sizeof(int));     if (p == (void *)0)   //直接用NULL     {         printf("内存分配失败！\n");         exit(1);//失败的时候终止程序     } 搜嘎 感谢感谢

user: user-1
content: 排序逻辑还有点问题，比如你是想从小到大排序，那么你输入时，可以考虑一种最坏的情况即输入的数是从大到小依次输入。这样看一下你的排序逻辑是否可行。 以下是冒泡排序逻辑供参考。虽然是动态申请的空间，你可以完全可以看成数组。 for (i = 0; i < n; i++)     {         for (j = 0; j < n - i - 1; j++)         {             if (*(p + j) > *(p + j + 1))//p[j] p[j+1]             {                 m = *(p + j);                 *(p + j) = *(p + j + 1);                 *(p + j + 1) = m;             }         }     } for (i = 0; i < n; i++)     {         for (j = 0; j < n - i - 1; j++)         {             if (p[j] > p[j+1])//p[j] p[j+1]             {                 m = p[j];                 p[j] = p[j+1];                 p[j+1] = m;             }         }     } 参考一下

user: user-2
content: p = (int *)malloc(n*sizeof(int)); 就行了  表示分配n个int大小的空间

user: user-1
content: p = (int *)malloc(n);     if (p == 0)     {         printf("内存分配失败！\n");         exit(1);//失败的时候终止程序     } 这部分有问题呢。 p是int类型指针，malloc后面跟的申请的字节数，根据你的代码逻辑，申请的n应该是n个int类型的数，而不是n个字节。注意n个字节和n个int类型的空间是有差距的，相差（n-1） * sizeof(int)个字节呢 所以，这部分要改一下，如下： p = (int *)malloc(n *sizeof(int));     if (p == (void *)0)   //直接用NULL     {         printf("内存分配失败！\n");         exit(1);//失败的时候终止程序     }

user: user-3
content: 可以，但是麻烦了一些，需要解决以下问题： 1：判断输入数据结束，比如用一个数作为结束标志或者一行（即读取一行字符串）或发生流错误等方法 2：动态数组不是很适用，因为个数未知，那么就不知道应该分配多大的内存（虽然有办法解决）。更好的方法是用链表实现