user-0 提问: 为什么超过后面几个不能正常排序？

回复:
user: user-0
content: 引用 4 楼 paschen 的回复:区别malloc、realloc 与 calloc 参数上的差异  改成：  psTemp = realloc(pS, capacity * sizeof(char*)) 非常感谢哦！

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h>  #define BUF_LEN 100                    // Length of input buffer #define COUNT        5                 // Initial number of strings  int main(void) {     char buf[BUF_LEN];                  // Input buffer     size_t str_count = 0;               // Current string count     size_t capacity = COUNT;            // Current maximum number of strings     char **pS = (char **)calloc(capacity, sizeof(char*));    // Pointers to strings     char** psTemp = NULL;               // Temporary pointer to pointer to char     char* pTemp = NULL;                 // Temporary pointer to char     size_t str_len = 0;                 // Length of a string     bool sorted = false;                // Indicated when strings are sorted      printf("Enter strings to be sorted, one per line. Press Enter to end:\n");     while(fgets(buf, BUF_LEN, stdin) != NULL)     {         if(str_count == capacity)         {             capacity += capacity/4;             printf("%d\n", capacity);             if(!(psTemp = (char **)realloc(pS, capacity * sizeof(char *))))                 return 1;             pS = psTemp;         }         str_len = strlen(buf) + 1;         if(!(pS[str_count] = (char *)malloc(str_len)))             return 2;         strcpy(pS[str_count++], buf);     }      int i;     while(!sorted)     {         sorted = true;         for(i = 0 ; i < str_count - 1 ; ++i)             if(strcmp(pS[i], pS[i + 1]) > 0)             {                 sorted = false;                 pTemp= pS[i];                 pS[i] = pS[i + 1];                 pS[i + 1]  = pTemp;             }     }      // Output the sorted strings     printf("Your input sorted in ascending sequence is:\n\n");     for(i = 0 ; i < str_count ; ++i)     {         printf("%s", pS[i]);         free(pS[i]);         pS[i] = NULL;     }     free(pS);     pS = NULL;      return 0; }  realloc的地方出了问题，确切的说是realloc第二个参数有问题，第二个参数是变更之后的空间大小，即原来的空间加上新的空间（若是增加）的大小；所以，需要的是capacity * sizeof(char *)的大小；如果只是capacity那么相当于空间缩小了，所以再输入字符串就越界了。 另外，判断fges的返回值，建议和NULL判断。如何退出循环输入呢？可以使用ctrl+d（Linux下），或ctrl+z（windows下）。非常感谢，这个失误我检查了很久都没有发现！ 谢谢

user: user-1
content: 区别malloc、realloc 与 calloc 参数上的差异  改成：  psTemp = realloc(pS, capacity * sizeof(char*))

user: user-2
content: #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h>  #define BUF_LEN 100                    // Length of input buffer #define COUNT        5                 // Initial number of strings  int main(void) {     char buf[BUF_LEN];                  // Input buffer     size_t str_count = 0;               // Current string count     size_t capacity = COUNT;            // Current maximum number of strings     char **pS = (char **)calloc(capacity, sizeof(char*));    // Pointers to strings     char** psTemp = NULL;               // Temporary pointer to pointer to char     char* pTemp = NULL;                 // Temporary pointer to char     size_t str_len = 0;                 // Length of a string     bool sorted = false;                // Indicated when strings are sorted      printf("Enter strings to be sorted, one per line. Press Enter to end:\n");     while(fgets(buf, BUF_LEN, stdin) != NULL)     {         if(str_count == capacity)         {             capacity += capacity/4;             printf("%d\n", capacity);             if(!(psTemp = (char **)realloc(pS, capacity * sizeof(char *))))                 return 1;             pS = psTemp;         }         str_len = strlen(buf) + 1;         if(!(pS[str_count] = (char *)malloc(str_len)))             return 2;         strcpy(pS[str_count++], buf);     }      int i;     while(!sorted)     {         sorted = true;         for(i = 0 ; i < str_count - 1 ; ++i)             if(strcmp(pS[i], pS[i + 1]) > 0)             {                 sorted = false;                 pTemp= pS[i];                 pS[i] = pS[i + 1];                 pS[i + 1]  = pTemp;             }     }      // Output the sorted strings     printf("Your input sorted in ascending sequence is:\n\n");     for(i = 0 ; i < str_count ; ++i)     {         printf("%s", pS[i]);         free(pS[i]);         pS[i] = NULL;     }     free(pS);     pS = NULL;      return 0; }  realloc的地方出了问题，确切的说是realloc第二个参数有问题，第二个参数是变更之后的空间大小，即原来的空间加上新的空间（若是增加）的大小；所以，需要的是capacity * sizeof(char *)的大小；如果只是capacity那么相当于空间缩小了，所以再输入字符串就越界了。 另外，判断fges的返回值，建议和NULL判断。如何退出循环输入呢？可以使用ctrl+d（Linux下），或ctrl+z（windows下）。

user: user-0
content: 引用 1 楼 coverlo 的回复: 输入到第六个就会报错， 是我指针哪里弄错了吗？

user: user-0