C:在另一个文件中访问数组会产生分段错误

时间:2017-10-30 07:25:10

标签: c arrays pointers malloc

我试图从.csv文件中读取值并将其写入另一个.txt文件中。但是当我试图传递值时会产生分段错误。

我的第一个程序,它从.csv文件中过滤所需的值:

int main(int argc, char **argv) {
    if (argc < 3) {
        printf("Aufruf: %s <anzahl> <bundesland>\n", argv[0]);
        printf("Beispiel: %s 100 Bayern\n", argv[0]);
        printf("Klein-/Großschreibung beachten!\n");
        exit(1);
    }
    int anzahl = atoi(argv[1]);
    char *bundesland = argv[2];

    // Statisch allokierter Speicher
    char staedte[MAX_LAENGE_ARR][MAX_LAENGE_STR];
    char laender[MAX_LAENGE_ARR][MAX_LAENGE_STR];
    int bewohner[MAX_LAENGE_ARR];

    int len = read_file("staedte.csv", staedte, laender, bewohner);

    // Hier implementieren
    char** result = malloc(MAX_LAENGE_ARR * sizeof(char *));
    if (result == NULL) {
        perror("malloc failed while allocating memory");
        exit(1);
        } 
    for (int i = 0; i < len; i++) {
        if (strcmp(bundesland, laender[i]) == 0 && *bewohner > anzahl) {
            result[i] = malloc(MAX_LAENGE_STR * sizeof(char *));
            if (result == NULL) {
                perror("malloc failed while allocating memory");
                exit(1);
            }
            snprintf(result[i], MAX_LAENGE_STR, "Die Stadt %s hat %d Einwohner.", staedte[i], bewohner[i]);
            write_file(&result[i], len);
            free(result[i]);
        }
    } 

    // Mithilfe von write_file(...) soll das Ergebnis in die "resultat.txt"
    // geschrieben werden. 
    // Dynamisch allozierter Speicher muss hier freigegeben werden.
}

我的第二个程序的错误部分,它应该将第一个程序的处理值写入.txt文件:

int MAX_LAENGE_STR = 255;
int MAX_LAENGE_ARR = 100;

void write_file(char *result[], int len) {
    FILE *fp = fopen("resultat.txt", "w");
    if (fp == NULL){
        perror("resultat.txt");
        exit(1);
    }
    for (int i=0; i<len; i++) {
        printf("<write_file> loop[%d]: %s\n", i, result[i]);
        fprintf(fp, "%p\n", result[i]);
    }
    fclose(fp);
}

它在write_file()中的第11个循环中创建了分段错误,我无法弄清楚原因。在valgrind中它是:&#34;无效的读取大小为1&#34;。

1 个答案:

答案 0 :(得分:2)

  1. result[i] = malloc(MAX_LAENGE_STR * sizeof(char *));
  2. 应该是

    result[i] = malloc(MAX_LAENGE_STR * sizeof(char));
    

    sizeof(char)始终定义为1,即使char表示超过8位,这是C定义所需的最小值。所以你可以避免在这里写它。

    1. write_file(&result[i], len);
    2. 应该是

      write_file(result[i], length(result[i]) );
      

      MAX_LAENGE_STR

      分配result[i]

      并将write_file的签名更改为

      void write_file(char *result, int len)
      

      因为你想传递一个字符串作为参数。

      1. printf("<write_file> loop[%d]: %s\n", i, result[i]);
      2. 应该是

        printf("<write_file> loop[%d]: %c\n", i, result[i]);
        

        因为你想在结果中打印第i个字符串,所有字符串一次。

        1. fprintf(fp, "%p\n", result[i]);
        2. 应该是

          fprintf(fp, "%c\n", result[i]);
          

          因为result[i]char,而不是指针。

          还有其他事情要说,先纠正这些。