私はcでメモリ割り当てに奇妙な問題がありますが、ファイルはかなり複雑ですので、ここにすべて含めることはできませんが、おそらくあなたは正しい方向に私がこのハプニング。私は文字列リテラルを作成しようとしています文字列リテラルのcでのメモリ割り付け
など:
:私は(直接宣言の後の行で)実行時に、この変数の値を見るとchar * p = "root"
は、しかし、私はこれを取得
$1 = 0x7001260c "me"
メモリの内容を0x7001260c
に見ると、実際には文字列「me」が保持されます。
EDIT: 次のコードを実行すると、最後の行の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);
}
}
'find_directory'が最初のパラメータが指しているものが変更された場合、それはあなたの問題です。文字列定数を指す 'path'で' create_directory'を呼び出します。次に、ポインタを文字列定数に 'find_directory'に渡します。 'find_directory'が' path'が指しているものを変更した場合、それは定数を変更します。 –
'create_directory'は、' path'が指しているものを変更するものとします。 'path'が何を指しているのかを修正することになっている場合、文字列定数で呼び出すことは明らかに間違っています。 'path'が何を指しているのかを修正しなければならない場合は、' path'を 'char const *'として取るように変更してください。次に、何が壊れているのかを見て、それを修正すると、 'find_directory'や' next_component'にバグが見つかるでしょう。 –
私はちょうどあなたのコードの別のバグに気づきました。 'while'ループで初めて' dir'を 'new'の最初のインスタンスを指すように設定しました。しかし、 'while'ループの2回目には、' dir'を 'add_dir_entry'に渡します - しかし' dir'は、 'new'の最初のインスタンスが存在したときの場所を指します。ああ。 'while'ループの2回目の反復では、最初のインスタンスからの' new'はもう存在しません。 –