c中字符串文字的内存分配

Memory allocation of string literal in c

我在 c 语言的内存分配方面遇到了一个奇怪的问题,文件相当复杂,所以我不能在这里全部包含它,但也许你可以指出正确的方向,说明为什么会发生这种情况。

我正在尝试创建这样的字符串文字:

char * p = "root"

但是当我在 运行 时间(在声明后的那一行)查看这个变量的值时,我得到这个:

 = 0x7001260c "me"

当我查看 0x7001260c 处的内存内容时,它确实包含字符串 "me"。

编辑: 为了在我 运行 以下代码时提供更多上下文,最后一行 p 的值是 "root".

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

而当我运行以下代码时p的值是"io"

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

create_directory函数:

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);
  }
}

几乎可以肯定,您的程序中某处存在一个错误,导致常量被修改,这当然是非法的。也许你正在做这样的事情:

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");

看看这是做什么的?我们将一个指向常量的指针传递给 sumeFunc,但它向下流向 to_lower,它修改它指向的东西——修改一个常量。

不知何故,您的代码可能会做类似的事情。

首先将 char * p = "root" 等代码更改为 char const* p = "root" 等代码。这将使您有更好的机会在编译时发现此类问题。