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