cjBucketHead
cjBucketHead

Reputation: 75

Why getting multiple definition error in C code?

i'm currently doing a simulation of adt in c, and i'm supposed to make a binary search tree invloving strings, i'm currently starting coding but i get this error and it doesnt say where the error comes from, here's the code, can somebody help me.

tree.h

#ifndef tree_h
#define tree_h
#include <stdbool.h>
#include <stdlib.h>

typedef struct tree_node* node_ptr;

struct tree_node {
    char* word;
    node_ptr leftNode, rightNode;
};

node_ptr start = NULL;

void addItem(char*, int);
void display();

#endif

tree.c

#include "tree.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>


void addItem(char arr[], int mode) {
    node_ptr temp, temp2;
     
    temp = (node_ptr)malloc(sizeof(struct tree_node));
    temp->leftNode=NULL;
    temp->rightNode=NULL;
    
    if(mode == 1){
        temp->word = arr;
        start = temp;
        }
    }  



void display() {
    node_ptr temp;
    temp = start;
    printf("%s", start->word);       
}

main.c

#include "tree.h"
#include <stdio.h>
#include <conio.h>

int main() {
    char word[31];
    
    printf("Enter Root Word: ");
    gets(word);
    addItem(word, 1);
}

Upvotes: 4

Views: 19756

Answers (4)

rajesh6115
rajesh6115

Reputation: 735

if(mode == 1)
{
temp->word = arr;/*here is another error*/
    start = temp;
    }

arr is local to main and i think for more nodes you must reuse the arr array for getting input.at that time it reflect in all the nodes as your word of each node point to same memory location.So it is not a option to directly assign.

You have to allocate memory dinamically for the string also.and then use strcpy() function for copying data to dynamic memory location.

ok use this code at that place:-

if(mode==1)
 {
  w_len=sizeof(char)*(strlen(arr)+1);//one extra character for null character
  temp->word=malloc(w_len);
  strcpy(temp->word,arr);
  start=temp;
 }

Upvotes: 1

Mahesh
Mahesh

Reputation: 34665

The problem is with the statement in tree.h.

node_ptr start = NULL;

And you are including tree.h in both main.c and tree.c. This gives the multiple definition error for the variable start which is at global scope. What you actually need is,

// tree.h

extern node_ptr start;  

And have the definition in a single source file like -

// tree.c

#include "tree.h"
........
node_ptr start = null;

Upvotes: 19

AusCBloke
AusCBloke

Reputation: 18532

The error that you're talking about is:

... multiple definition of `start'

Since you have node_ptr start = NULL; in tree.h, each compilation unit that includes tree.h will have their own definition of the variable start. When it comes time to linking, the linker will see multiple definitions of the variable start and throw an error.

To avoid this, define start in tree.c:

node_ptr start;

And then declare start as extern, so that other compilation units know about it but won't try and define it themselves, in your header file tree.h:

extern node_ptr start;

Upvotes: 7

ardent
ardent

Reputation: 2513

Your error is that you define:

node_ptr start = NULL;

In your header file, thus when you import it (regardless of the macro guard) you're going to get two redefinitions of start.

Upvotes: 3

Related Questions