BenJacob
BenJacob

Reputation: 987

Memory allocation of string literal in c

I am having a strange issue with memory allocation in c, the file is fairly complicated so I cannot include it all here but perhaps you can point me in the right direction as to why this may be happening.

I am trying to create a string literal as such:

char * p = "root"

But when i look at the value of this variable at runtime (at the line directly after the declaration) i get this:

$1 = 0x7001260c "me"

and when I look at the contents of the memory at 0x7001260c it indeed holds the string "me".

EDIT: To give more context when I run the following code the value of p on the last line is "root".

  create_directory("root/home");
  char * p = "root";
  char * q = "foo";

And when I run the following code the value of p is "io"

  create_directory("io/home");
  char * p = "root";
  char * q = "foo";

The create_directory function:

void create_directory(char * path) {
  directory d;
  directory * dir = &d;
  //Browse to closest directory
  path = find_directory(path, dir);
  //Create remaining directories
  char component[20];
  path = next_component(path, component);
  while (strlen(component) > 0) {
    add_dir_entry(dir, component, inode_next);
    write_dir_entry(dir, inode_to_loc(dir->inode));
    directory new;
    new.type = DIRECTORY;
    new.inode = inode_next;
    write_dir_entry(&new, inode_to_loc(inode_next));
    inode_next++;
    dir = &new;

    path = next_component(path, component);
  }
}

Upvotes: 0

Views: 154

Answers (1)

David Schwartz
David Schwartz

Reputation: 182753

Almost certainly, there's a bug somewhere in your program that causes a constant to be modified which is, of course, illegal. Perhaps you're doing something like this:

void to_lower(char *j)
{
    while (*j != 0) { *j = tolower(*j); j++; }
}

...

bool is_yes(char *k)
{
    to_lower(k);
    return strcmp(k, "yes") == 0;
}

void someFunc(char *k)
{
   if (is_yes(k)) // ...
   ...
}

someFunc("testing");

See what this does? We pass a pointer to a constant to sumeFunc, but it flows down to to_lower which modifies the thing it points to -- modifying a constant.

Somehow, your code probably does something like that.

Start by changing code like char * p = "root" to code like char const* p = "root". That will give you a better chance of catching this kind of problem at compile time.

Upvotes: 1

Related Questions