c

时间:2016-04-27 10:14:11

标签: memory-management string-literals

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

我正在尝试创建一个字符串文字:

char * p = "root"

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

$1 = 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);
  }
}

1 个答案:

答案 0 :(得分:1)

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

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"。这将使您在编译时更好地捕获此类问题。