0
struct _StoryElement_ {
char *title_of_chapter_;
struct _StoryElement_ *path_a_;
struct _StoryElement_ *path_b_;
char *content_of_chapter_;
};
typedef struct _StoryElement_ StoryElement;

So I have a Tree of these Structs created each containing different values. I initialised them all using the following functions:

StoryElement *insertIntoStoryElement(StoryElement* root, char* title_of_chapter, char* content_of_chapter)
{
  if(root == NULL)
  {
    root = makeNewStoryElement(root, title_of_chapter, content_of_chapter);
  }
  else if (root->path_a_ == NULL)
  {
    root->path_a_ = makeNewStoryElement(root, title_of_chapter, content_of_chapter);
  }
  else if (root->path_b_ == NULL)
  {
    root->path_b_ = makeNewStoryElement(root, title_of_chapter, content_of_chapter);
  }

  return root;
}

StoryElement *makeNewStoryElement(StoryElement* root, char* title_of_chapter,
                                  char* content_of_chapter)
{
  root = (StoryElement*) malloc(sizeof(StoryElement));

  root->title_of_chapter_ =
  (char*)malloc(sizeof(char*)*(strlen(title_of_chapter) + 1));
  root->content_of_chapter_ =
  (char*)malloc(sizeof(char*)*(strlen(title_of_chapter) + 1));

  //strcpy(NewStoryElement->title_of_chapter_, title_of_chapter);
  //strcpy(NewStoryElement->content_of_chapter_, content_of_chapter);
  title_of_chapter = root->title_of_chapter_;
  content_of_chapter = root->content_of_chapter_;

  root->path_a_ = NULL;
  root->path_b_ = NULL;

  return root;
}

This function is what provides me with the string values that I pass onto insertIntoStoryElement():

StoryElement *createStoryTree (StoryElement *root, char *storage)
{

  char* pos = storage;
  pos = strchr(pos, '\n');
  *pos = '\0';
  int size = strlen(storage);
  char* title = malloc(size + 1);
  strcpy(title, storage);

  char* ptr_path_a = pos + 1;
  pos = strchr(ptr_path_a, '\n');
  *pos = '\0';
  size = strlen(ptr_path_a);
  char* path_a = malloc(size + 1);
  strcpy(path_a, ptr_path_a);

  char* ptr_path_b = pos + 1;
  pos = strchr(ptr_path_b, '\n');
  *pos = '\0';
  size = strlen(ptr_path_b);
  char* path_b = malloc(size + 1);
  strcpy(path_b, ptr_path_b);

  char* ptr_text = pos + 1;
  pos = strchr(pos + 1, '\0');
  *pos = '\0';
  size = strlen(ptr_text);
  char* text = malloc(size + 1);
  strcpy(text, ptr_text);

  root = insertIntoStoryElement(root, title, text);

/*  if(strcmp(path_a, "-")!=0 && strcmp(path_b, "-")!=0)
  {*/
    root->path_a_ = readStoryFromFile(root->path_a_, path_a);
    root->path_a_ = readStoryFromFile(root->path_b_, path_b);
  //}

  return root;
}

And this is the function that is ultimately called in main:

StoryElement *readStoryFromFile (StoryElement *root, char *filename)
{
  if(strcmp(filename, "-") == 0)
  {
    //printf("End  reached\n");
    return 0;
  }
  FILE *file = fopen(filename, "r");

    if(!file)
  {
    printf("[ERR] Could not read file %s.\n", filename);
    return 0;
  }

  long fsize = getFileSize(file);

  char* storage = malloc(fsize + 1);
  if(!storage)
  {
    printf("[ERR] Out of memory.\n");
    return 0;
  }

  fread(storage, fsize, 1, file);
  storage[fsize] = '\0';
  fclose(file);

  root = createStoryTree(root, storage);

  free(storage);

  return root;
}

And this is my main which uses another function but only the 2 above are relevant for this question I think:

int main ( int argc, char *argv[] )
{
  if ( argc != 2 ) /* argc should be 2 for correct execution */
  {
    printf( "Usage: ./ass2 [file-name]\n");
    return (1);
  }

  StoryElement *root = NULL;

  root = readStoryFromFile(root, argv[1]);
  if(!root)
    return 3;

  printf("%p\n", root);
  printf("%s\n", root->title_of_chapter_);

  //printStoryTree(root);
  freeStoryTree(root);

  root = NULL;

  return 0;
}

And finally my problem is that the 2 printfs after in the main function return the following: First pointer Address is ok I think, but the second printf should be "Kapitel_1.txt" Why am I getting a garbage value here? Is this a segmentation fault?

5
  • As errors turn out to be in the most unexpected places, we want to see readStoryFromFile and be able to follow it until it returns (and print the wrong data). Please provide it. Commented Dec 2, 2017 at 18:00
  • Using trailing underscores in names is discouraged and should be reserved for the system and libraries. Commented Dec 2, 2017 at 18:02
  • Why did you comment out the two strcpy statements in makeNewStoryElement? Indeed, now it won't work. Commented Dec 2, 2017 at 18:04
  • You assign the local pointers withe address' of the malloced memory looking the texts passed to the function. You do not copy anything to the malloced space. You need to read something about the pointers. Commented Dec 2, 2017 at 18:11
  • Provided all of the used functions up until the garbage value is printed Commented Dec 2, 2017 at 18:44

1 Answer 1

1

In your function makeNewStoryElement you malloc the space for root->title_of_chapter but you don't put the content of the given title_of_chapter in it. This means that root->title_of_chapter will contain whatever garbage data was in the location you got back from the malloc.
Do something like strcpy(root->title_of_chapter, title_of_chapter);
the printf will then be fine.
The code has some other problems and things you shouldn't do but this should fix the problem that you are asking about.

Sign up to request clarification or add additional context in comments.

1 Comment

I did infact try the strcpy() function (The comment out ones but with "root->title_of_chapter_") but it results in another my programm crashing due to another fault. Probably from createStoryTree function.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.