0

新しいIDEを正しくインストールしたかどうかをテストしようとしていて、この基本的なプログラムをIDEとgeditとGCCの両方でコンパイルしようとしましたが、コンパイルされましたが、コマンドラインで実行可能ファイルを起動した後にクラッシュしました-何もありませんほとんどの人によると、私はまだCのポインターにかなり慣れていないため、理論に頭を悩ませるのに時間がかかるため、何が問題なのかを考えてください。

コード:

#include <stdio.h>
#include <string.h>

    char print_func(char *hi);

    int main(void) {
        char *hi = "Hello, World!";
        print_func(*hi);
    }

    char print_func(char *hi) {
        printf("%d \n", *hi);
    }

私はこれを試しました:

#include <stdio.h>
#include <string.h>

char print_func(char *hi);

int main(void) {
    char *hi = "Hello, World!";
    print_func(&hi);
}

char print_func(char *hi) {
    printf("%d \n", *hi);
}

クラッシュなしで44を出力します。

4

4 に答える 4

1

これは、文字値を関数に渡し、それを print_func のポインター変数「hi」へのアドレスとして指定しているためです。あなたのプログラムが文字列を出力することを目的としているなら、これは良いことです -->

#include <stdio.h>
#include <string.h>

char print_func(char *hi);

int main(void) {
    char *hi = "Hello, World!";
    print_func(hi);
}

char print_func(char *hi) {
    printf("%s \n", hi);
}
于 2013-09-03T17:35:31.393 に答える
1

間接使用を行う場合print_func(*hi);は、char を渡し、1 バイトです。そのため、より大きな整数を読み取ろうとすると、アクセス違反が発生します。ポインターを使用して関数を呼び出す必要がありますprint_func(hi)。また、文字列のアドレスを出力したい場合は%p、printfで使用することをお勧めします。

printf("%p \n", hi); // print the address of hi

hi の最初の文字を出力したい場合は、%c代わりに次を使用します。

printf("%c \n", *hi); // print first character of hi

hi の最初の文字の値を出力したい場合は、%d代わりにキャストを使用します。

printf("%d \n", (int)*hi); // print the value of the first character of hi

文字列全体を出力する%sには、ポインタを使用して渡します。

printf("%s \n", hi);
于 2012-07-22T14:52:54.870 に答える
0

2 番目のケースでも、問題が発生します。

print_func(&hi);

ポインター自体だけを渡す必要がありますが、ポインターのアドレスを渡しています。&in 関数呼び出しをドロップします。

于 2012-07-22T14:49:43.560 に答える
0

さて、あなたの関数はパラメータとして文字列を待っていて、文字またはポインタを string に送信します!

文字列の最初の文字を出力したい場合は、文字列を送信するだけです。

print_func(hi);
于 2012-07-22T14:50:51.190 に答える