1

ポインターが何であるかは知っていますが、文字列/配列になると本当に混乱します。誰かが答えやそれを説明するウェブサイトを持っていれば、それは素晴らしいことです. 例えば:

char * strncopy (char*dest, char * source, size_t);

なぜポインタ?それは何を指しているのですか?通常、ポインタはアドレスを格納しますか?

私の教科書では、各文字列構築関数はポインター char* 型であると言われています。

また、問題を解決するプログラムを書けるかどうか試してみましたが、うまくいきませんでした。誰かがそれを修正する方法、または私が間違っていることを教えてもらえますか。

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

char * getname ()
{
    char name [10];
    scanf ("%s", name);
    return (name);
}    

int main (void)
{
    char name[10];
    printf ("Enter your name\n");
    name[] = getname();
    printf ("Hi %s", name);
    return (0);
}
4

2 に答える 2

1

getname 関数内で、名前配列へのポインターを返すと、それがスタックに割り当てられているために破棄され、無効なポインターが残ります。このようなポインターを逆参照すると、非常に多くの問題が発生します。

ポインターを返すときにデータが破壊されないように、malloc/calloc を使用してヒープ上の getname 内に名前配列を割り当てる必要があります。

strncpy のような関数に関しては、結果の文字列へのポインターを返す傾向があります。例: strncpy は宛先へのポインタを返します。

于 2012-04-09T00:57:19.097 に答える
0

ポインター自体はアドレスを表します。たとえば、ポインターを入力したchar *pstr場合、基になるアドレスをいつでも確認できますprintf("address of my pointer %p\n", pstr);

C プログラミング言語では、文字列はchar. 配列とそのメモリ レイアウトについて十分な知識があれば、C スタイルの文字列を理解するのは難しくありません。一般的に言えば、C の配列は、配列の名前が配列の最初の要素のアドレスを表す連続したメモリのチャンクです。char最初の文字の配列アドレスの名前を持つメモリのチャンクである文字列もそうです。さらに、c スタイルの string は character\0で終了するため、 string のメモリを自分で管理したい場合は、末尾の 1 バイトを余分に覚えておいてください\0

2番目の問題に関しては、namein 関数getnameは、関数が戻ると寿命が終了するローカル変数です。ただし、name不適切な関数の外部にアクセスする必要があります。これは、dasblinkenlight や他の投稿のように動的にメモリを割り当てることで解決できます。

幸運を。

于 2012-04-09T01:12:07.483 に答える