user-0 提问: 请教：这个代码的segmentation fault 在哪里？

回复:
user: user-0
content: 引用 7 楼 max_min_ 的回复:  while(cnt_1 <= SIZE && fgets(names_1[cnt_1], MAX, fp1) != NULL)     {         pnames_1[cnt_1] = names_1[cnt_1];        // 这里都没有分配内存的，你定义的数组指针的，有SIZE指针而已，但是每个指针都没有分配内存              pnms_1[cnt_1] = nms_1[cnt_1];    // cnt_1的值有是是不能等于cnt_1的，但是while是可以的，所以这里也可能导致越界的危险         cnt_1++;     }     while(cnt_2 <= SIZE && fgets(names_2[cnt_2], MAX, fp2) != NULL)     {         //这里的错误和上面的类似。自己修改过来吧！每个数组指针，每个指针都分配内存过去         pnames_2[cnt_2] = names_2[cnt_2];         pnms_2[cnt_2] = nms_2[cnt_2];         cnt_2++;     }  谢谢指教。我没有分配空间，但我有让指针指向已经分配了空间的数组。如果给指针数组分配了空间，那这个数组里的指针就有了自己空间了，也就是说它们自己也成为了数组了。这样它还能影响到它所指向数组吗？

user: user-1
content: 中文名字要考虑编码方式哦。

user: user-2
content: while(cnt_1 <= SIZE && fgets(names_1[cnt_1], MAX, fp1) != NULL)     {         pnames_1[cnt_1] = names_1[cnt_1];        // 这里都没有分配内存的，你定义的数组指针的，有SIZE指针而已，但是每个指针都没有分配内存              pnms_1[cnt_1] = nms_1[cnt_1];    // cnt_1的值有是是不能等于cnt_1的，但是while是可以的，所以这里也可能导致越界的危险         cnt_1++;     }     while(cnt_2 <= SIZE && fgets(names_2[cnt_2], MAX, fp2) != NULL)     {         //这里的错误和上面的类似。自己修改过来吧！每个数组指针，每个指针都分配内存过去         pnames_2[cnt_2] = names_2[cnt_2];         pnms_2[cnt_2] = nms_2[cnt_2];         cnt_2++;     }

user: user-0
content: 引用 5 楼 lunat 的回复:数组访问越界：  while(cnt_1 <= SIZE && fgets(names_1[cnt_1], MAX, fp1) != NULL) 改为： while(cnt_1 < SIZE && fgets(names_1[cnt_1], MAX, fp1) != NULL)   while(cnt_2 <= SIZE && fgets(names_2[cnt_2], MAX, fp2) != NULL) 改为： while(cnt_2 < SIZE && fgets(names_2[cnt_2], MAX, fp2) != NULL)   另外建议在使用指针数组之前先初始化，例如： memset(&pnames_1, 0, sizeof(pnames_1)); 谢谢！你指出的问题确实存在，但改了之后问题依旧。真是头疼了！

user: user-0
content: 引用 10 楼 lunat 的回复:添加打印信息，看最后输出打印的地方在哪里，缩小问题范围，有助于分析;  for(i = 0; i < cnt_1; i++)         for(j = 0; j < cnt_2; j++)             if(strcmp(nms_1[i], nms_2[j]) == 0)             {                 fnd[i] = nms_1[i];                 cnt_fnd++;             }  这里面的fnd[i] = nms_1[i];改为： fnd[cnt_fnd] = nms_1[i]; 此是正解！谢谢！

user: user-3
content: 添加打印信息，看最后输出打印的地方在哪里，缩小问题范围，有助于分析;  for(i = 0; i < cnt_1; i++)         for(j = 0; j < cnt_2; j++)             if(strcmp(nms_1[i], nms_2[j]) == 0)             {                 fnd[i] = nms_1[i];                 cnt_fnd++;             }  这里面的fnd[i] = nms_1[i];改为： fnd[cnt_fnd] = nms_1[i];

user: user-3
content: 数组访问越界：  while(cnt_1 <= SIZE && fgets(names_1[cnt_1], MAX, fp1) != NULL) 改为： while(cnt_1 < SIZE && fgets(names_1[cnt_1], MAX, fp1) != NULL)   while(cnt_2 <= SIZE && fgets(names_2[cnt_2], MAX, fp2) != NULL) 改为： while(cnt_2 < SIZE && fgets(names_2[cnt_2], MAX, fp2) != NULL)   另外建议在使用指针数组之前先初始化，例如： memset(&pnames_1, 0, sizeof(pnames_1));

user: user-4
content: 你自己设个断点看看，这个应该会的吧？自己跟进去，单步调试。

user: user-0
content: 我修正了一些错误，但主要的segmentation fault：  #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h>  #define SIZE 60 #define MAX  20  int main(void) {     char names_1[SIZE][MAX];     char names_2[SIZE][MAX];     char * pnames_1[SIZE], * pnames_2[SIZE];     char nms_1[SIZE][MAX];     char nms_2[SIZE][MAX];     char * pnms_1[SIZE], * pnms_2[SIZE];     char * fnd[SIZE];     int cnt_1 = 0, cnt_2 = 0, cnt_fnd = 0;     int i,j;     FILE *fp1, *fp2, *fp3;      if((fp1 = fopen("list1.txt", "r")) == NULL)     {         fputs("Error reading \"listing1.txt\".", stderr);         exit(1);     }     if((fp2 = fopen("list2.txt", "r")) == NULL)     {         fputs("Error reading \"listing2.txt\".", stderr);         exit(1);     }     if((fp3 = fopen("results.txt", "w")) == NULL)     {         fputs("Error writing \"results.txt\".", stderr);         exit(1);     }     while(cnt_1 <= SIZE && fgets(names_1[cnt_1], MAX, fp1) != NULL)     {         pnames_1[cnt_1] = names_1[cnt_1];         pnms_1[cnt_1] = nms_1[cnt_1];         cnt_1++;     }     while(cnt_2 <= SIZE && fgets(names_2[cnt_2], MAX, fp2) != NULL)     {         pnames_2[cnt_2] = names_2[cnt_2];         pnms_2[cnt_2] = nms_2[cnt_2];         cnt_2++;     }      for(i = 0; i < cnt_1; i++)     {         while(*(pnames_1[i]) && !isspace(*pnames_1[i]))         {             *pnms_1[i] = *pnames_1[i];             pnames_1[i]++;             pnms_1[i]++;         }         * pnms_1[i] = '\0';     }     for(i = 0; i < cnt_2; i++)     {         while(*(pnames_2[i]) && !isspace(*pnames_2[i]))         {             *pnms_2[i] = *pnames_2[i];             pnames_2[i]++;             pnms_2[i]++;         }         * pnms_2[i] = '\0';     }     for(i = 0; i < cnt_1; i++)         for(j = 0; j < cnt_2; j++)             if(strcmp(nms_1[i], nms_2[j]) == 0)             {                 fnd[i] = nms_1[i];                 cnt_fnd++;             }     if(cnt_fnd > 0)     {         for(i = 0; i < cnt_fnd; i++)         {             fputs(fnd[i], fp3);             putchar('\n');         }         fprintf(fp3, "\n%d found.", cnt_fnd);     }     else         fputs("\nNo results found.", fp3);     printf("\n%d\n", cnt_fnd);     puts("\nDone!");     fclose(fp1);     fclose(fp2);     fclose(fp3);      return 0; }

user: user-5
content: segmentation fault非法读写内存  多为  1 指针未初始化 2 数组越界 导致

user: user-6
content: 出现的问题的时候没有断住吗？