2017-10-05 4 views
0

Je reçois une erreur de segmentation lorsque j'essaie d'imprimer une chaîne. Voici un contexte pour le problème, je pense que c'est en raison de moi en quelque sorte passer une structure incorrecte. Charger le fichier lit * chemin_fichier et le renvoie en tant que structure de document, mais dans int main() sudo ne contient aucune donnée. Je lance le programme gdb et doc à l'intérieur de load_file() a des données valides à l'intérieur de celui-ci, mais sudo (aussi un struct document principal int() ne récupère les données. Y at-il une raison pour laquelle?C - struct retournée par la fonction non affectée à la variable

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
const char *sudoers_path = "thing"; 
char *read_string = "sandos"; 
int read_string_len = 6; 
struct document{ 
    char *string; 
    int length; 
}; 
struct document sudoers; 
struct document loadfile(char *file_path){ 
    char char_temp[2] = "1"; 
    struct document doc; 
    int temp=0; 
    FILE *file = fopen(file_path,"r"); 
    doc.string = (char *)malloc(10*sizeof(*doc.string)); 
    doc.length=10; 
    int len_doc_read = 0; 
    while(temp != EOF){ 
     temp = fgetc(file); 
    if(temp == EOF){ 
     break; 
    } 
    char_temp[0] = (char) temp; 
    if(doc.length - len_doc_read==0){ 
     doc.string = (char *)realloc(doc.string, (doc.length+10)*sizeof(*doc.string)); 
     for(int i = doc.length; i< len_doc_read-2; i++) 
      doc.string[i]=' '; 
     doc.string[doc.length-1] = '\0'; 
    } 
    len_doc_read++; 
    strcat(doc.string, char_temp); 
    strcat(doc.string, "\0"); 
    doc.length++; 
} 
//I am the cracker of C, destroyer of programming! --me 
if(doc.string = NULL) 
    printf("memory failed"); 
return doc; 
} 

int main(){ 
    struct document sudo = loadfile(sudoers_path); 
    struct document sand_find; 
    sand_find.string = "sandos"; 
    sand_find.length = 7; 
    puts(sudo.string); 
    return 0; 
} 

Incase il importe que je suis la compilation et l'exécution du programme sur une version moderne de Arch Linux et COMAND que j'utilise pour compiler est

$ gcc main.c -o out 
+1

Étape 1: vérifier la valeur de retour après 'FILE * file = fopen (file_path, "r")' –

+0

Je vous recommande de lire [Comment déboguer des petits programmes] (https: //ericlippert.com/2014/03/05/how-to-debug-small-programs/) par Eric Lippert, et apprendre à utiliser un * débogueur * pour parcourir votre code ligne par ligne. Aussi, s'il vous plaît [lire sur la façon de poser de bonnes questions] (http://stackoverflow.com/help/how-to-ask), et éditez votre question pour nous montrer le contenu du fichier que vous avez lu, et la sortie attendue et réelle de votre programme. –

+0

Une chose que je remarque, c'est qu'après 'for (int i = doc.length; i

Répondre

3

Dans votre programme, par erreur au lieu de vérifier la valeur NULL, vous assignez NULL à doc.string -

if(doc.string = NULL) 

Modifier à -

if(doc.string == NULL)