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"
等代码。这将使您有更好的机会在编译时发现此类问题。
我在 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"
等代码。这将使您有更好的机会在编译时发现此类问题。