-2

私は1時間Googleをチェックしています。typdefを使用してみましたが、同じ結果が得られます。構造スコープに関して少し混乱しています。私が見逃しているのはばかげたことだと確信しています。

例、0を出力します:

#include <stdio.h>
struct info
{
    int i;
};
struct info testinfo;

int test()
{

    testinfo.i = 5;
}

int main()
{
    printf("%d", testinfo.i);
}
4

6 に答える 6

7

両方の構造体情報には、ローカル変数として宣言するため、ブロック スコープがあります。したがって、それらは異なるオブジェクトです。ファイル スコープ (関数の外) で 1 つだけ宣言します。

(問題のコードは編集されており、この回答は最初のバグに関するものです)。

于 2012-06-07T20:23:08.913 に答える
3

これは構造体とは関係ありません。どの型でも同じ動作が見られます。何が起こっているかというと、それぞれtestinfoが異なるスコープと名前空間にあるということです。

また、関数を呼び出すことはありません。

グローバルにするかtestinfo、ポインターで渡すことができます。これはより良いアイデアです。

#include <stdio.h>

struct info
{
    char* buf;
};

int test(struct info* testinfo)
{
    testinfo->buf = "test"; // it's a bad idea to have a char* to a literal
                            // you should probably allocate new storage
}

int main()
{
    struct info testinfo;
    test(&testinfo);
    printf("%s", testinfo.buf);
}
于 2012-06-07T20:24:15.557 に答える
2

変数testinfoを関数に渡すか、構造体test()test()返す必要がありますinfo

最初のオプションは次のとおりです。

int test(struct info * ti) {
  ti->buf = "test";
}
int main() {
  struct info testinfo;
  test(&testinfo);
  printf("%s", testinfo.buf);
}

: は*構造体へのポインタを示します。そうしないと、構造体をコピーし、それに対する変更はコピーでのみ発生します (そのため、mainバージョンは変更されません)。

于 2012-06-07T20:23:53.270 に答える
0

あなたはできません

testinfo.buf = "test"
  1. 文字列にスペースを割り当てる必要があります。 buf は単なる文字ポインターです。

struct info { char buf[10]; /*10 is the space for buf*/ };

strcpy(dest,source)また、文字列を割り当てるときにも使用する必要があります。また、テストを呼び出していません。これら 2 つのことを整理すると、出力が得られます。

于 2012-06-07T20:26:49.143 に答える
0

ジョン、更新された質問でtestprintf.

すなわち

int main()
{
  test();
  printf("%d", testinfo.i);
  return(0);
} 
于 2012-06-07T20:28:09.907 に答える
0

あなたがするとき

printf("%s", testinfo.buf);

testinfo.buf が割り当てられていません! 試す

struct info testinfo;
testinfo.buf = (char *) malloc(123);

<編集>

strcpy(testinfo.buf, "hello world!");

</編集>

printf("%s", testinfo.buf);

バッファを割り当てます。

于 2012-06-07T20:23:56.523 に答える