2016-04-27 11 views
0

私は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); 
    } 
} 
+0

'find_directory'が最初のパラメータが指しているものが変更された場合、それはあなたの問題です。文字列定数を指す 'path'で' create_directory'を呼び出します。次に、ポインタを文字列定数に 'find_directory'に渡します。 'find_directory'が' path'が指しているものを変更した場合、それは定数を変更します。 –

+0

'create_directory'は、' path'が指しているものを変更するものとします。 'path'が何を指しているのかを修正することになっている場合、文字列定数で呼び出すことは明らかに間違っています。 'path'が何を指しているのかを修正しなければならない場合は、' path'を 'char const *'として取るように変更してください。次に、何が壊れているのかを見て、それを修正すると、 'find_directory'や' next_component'にバグが見つかるでしょう。 –

+0

私はちょうどあなたのコードの別のバグに気づきました。 'while'ループで初めて' dir'を 'new'の最初のインスタンスを指すように設定しました。しかし、 'while'ループの2回目には、' dir'を 'add_dir_entry'に渡します - しかし' dir'は、 'new'の最初のインスタンスが存在したときの場所を指します。ああ。 'while'ループの2回目の反復では、最初のインスタンスからの' new'はもう存在しません。 –

答えて

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"のように変更することから始めます。コンパイル時にこのような問題が発生する可能性が高くなります。

+0

どのように起こっているのか分かりません。宣言のすぐ下の行にあるpの値をチェックします。関数やその値を変更できるものには渡されません。 – BenJacob

+0

@BenJacob 'p'やそのコードの近くにある必要はありません。それは完全に異なるコードにすることができますが、ほとんどの場合、同じ文字列定数を操作するコードです。 '' root ''の他のインスタンスを探します。 –

+0

Cが文字列定数を扱う方法を知っているとは確信していません。質問にいくつかのコンテキストを追加しました。何が起こっているのか気になりますか?どうもありがとう。 – BenJacob