4

strdup(value) (int)value使用した後、以前とは異なる出力が返されるのはなぜですか?同じ出力を取得するにはどうすればよいですか?

私の短い例はうまくいきませんでした。長い例を使用してください:ここにテストの完全なコードがあります:

#include <stdio.h>
#include <iostream>

int main()
{

    //The First Part
    char *c = "ARD-642564";
    char *ca = "ARD-642564";

    std::cout << c << std::endl;
    std::cout << ca << std::endl;

//c and ca are equal
    std::cout << (int)c << std::endl;
    std::cout << (int)ca << std::endl;


    //The Second Part
    c = strdup("ARD-642564");
    ca = strdup("ARD-642564");

    std::cout << c << std::endl;
    std::cout << ca << std::endl;

//c and ca are NOT equal Why?
    std::cout << (int)c << std::endl;
    std::cout << (int)ca << std::endl;

    int x;
    std::cin >> x;
}
4

2 に答える 2

7

あなたの場合、配列はポインタに減衰するため、ポインタを出力しています(つまり、エキゾチックでないコンピュータでは、メモリアドレス)。ポインタがに収まるという保証はありませんint

  • コードの最初の部分で、等しくする必要はcありcaません。コンパイラは一種のメモリ最適化を実行します(完全な答えについてはここを参照してください)。

  • 2番目の部分でstrdupは、返されるポインタが等しくないように、文字列を2回動的に割り当てます。コンパイラは、の定義を制御していないように見えるため、これらの呼び出しを最適化しませんstrdup

どちらの場合も、cca等しくない場合があります。

于 2013-03-23T11:07:45.260 に答える
4

「strdup()関数は、s1が指す文字列の複製である新しい文字列へのポインタを返します。」ソース

したがって、ポインタが異なることは非常に理解できます。

于 2013-03-23T11:07:30.473 に答える