9

このコードが機能する理由 を出力する前に逆参照する必要があると思いますが、そのようにしようとすると が得ptrられ ます。 printf("%s\n", *ptr);Segmentation Fault

#include <stdio.h>

int main(int argc, char *argv[])
{
        char name[] = "Jordan";
        char *ptr = name;
        printf("%s\n", ptr);
}

皆さんが私にいくつかの洞察を与えてくれることを願っています。

4

6 に答える 6

24
于 2013-04-05T19:14:35.867 に答える
7

This is because the %s format specifier in the format string you pass to printf means that the corresponding argument should be a string, not a single character. And in C, a string is a pointer to the beginning of a block of characters that has a null character (byte with a value of 0) at the end.

Basically, this works because you're doing exactly what you're supposed to in order to print a string.

于 2013-04-05T19:14:40.273 に答える
2

printfの%sフォーマッタは「文字列」を想定していますが、これは実際には null で終わる文字配列へのポインタです。

つまり、printfは、ポインタを渡すことを期待しています。ポインターを逆参照すると、ascii の値が 74 (10 進数) である文字 J を取得し、それを配列へのポインターとして処理しようとします。これはアクセスできないメモリ領域であるため、セグメンテーション違反が発生します。

于 2013-04-05T19:15:41.297 に答える
1

フォーマット指定子%sprintf、NULL で終わる char 配列へのポインターを予期するように指示します。nameこれは何ですかptr

*nameそうで*ptrはありません。それらを逆参照すると、char基本的に嘘をついている単一のが返さprintfれ、未定義の動作が発生します。

于 2013-04-05T19:14:07.423 に答える
0

*ptrcharは本質的に、 の文字列ではなく、単一の への参照charです。このため、char *本質char[]的に同じものです

于 2013-04-05T19:15:05.213 に答える
0

char prt = name を宣言すると、それを逆参照している場所になります。ここの " " は変数の一部ではなく、その変数が何を指すかを示すためのものです。*prt を printf に再度入れると、2 回実行することになります。name は文字の配列で、*ptr はそれらの文字への逆参照ポインターです。

説明が役立つことを願っています:-)

于 2013-04-05T19:16:27.387 に答える