错误在哪里? (C程序不会打印出动态数组的内容)

Where is the error? (C program won't print out the content of dynamic array)

任务是从特定文件中读取前 20 行并将它们格式化为仅使用特定部分,下一步是将这些格式化的字符串存储在动态数组中(char ** str |指向的指针一个指针),将它发送到一个函数并用所述函数打印出来

主要代码如下:

int main(int argc, char* argv[]){
    FILE* file = fopen("./passwd.txt", "r");  // open file

    if (!file)
    {
        perror("Error opening file");
        return 1;
    }
    char line [MAXCHARS];
    int counter = 0;
    char ** str;
    str = malloc(20  * sizeof (char*));
    while (fgets(line, MAXCHARS, file) && counter < 20) {
        char * position;
        if ((position = strchr(line,':'))){
            char * end_char;
            *position = 0;        //setting here the value 0, will terminate the string line (first column)
            if((position = strchr(++position,':')) && (end_char = strchr(++position,':'))){ //increment the position to skip the second column
                *end_char = 0; //set the value 0 to end_char to terminate the string pointed by position
                char * temp_str = "[=10=]";
                sprintf(temp_str, "{%d} - {%s}\n", atoi(position), line ); //concatenate line and userID into one string and store it into a temporary string
                *(str + counter) = malloc(sizeof (char) * strlen(temp_str)); //set the memory space for the temp_string into the array
                *(str + counter) =  temp_str; //copy the string into the array

            }
        }
        counter++;
    }

    printArray(str);

    fclose(file);
    if (line)
        free(line);


    return 0;
}

这里是打印函数:

void printArray(char ** array){
    for(int i = 0; i < 20; i++){
        printf("%s",*(array+i));
        free(*(array+i));
    }
    free(array);
}

我找不到错误,代码用

编译
Process finished with exit code -1073741819 (0xC0000005)

所以至少它可以编译,我认为这只是我的指针处理技巧的问题,但我找不到错误。

有人可以帮助我吗?

您的程序中有 3 个错误:

  1. 使用未分配的temp_str

    char * temp_str = "[=10=]";
    sprintf(temp_str, "{%d} - {%s}\n", atoi(position), line ); 
    
  2. temp_str 本地指针的地址保存到 str+counter 并在指针超出 printArray=> 未定义行为

    的范围后使用该指针
  3. line不是指针,不能用free

    if (line)
    {
       free(line);
    }
    

让我们试试这个。 https://godbolt.org/z/7KPfnTEMY我更正这些点