0
#include<stdio.h>
#include<malloc.h>
void my_strcpy(char *sour,char *dest){
 if(sour == NULL || dest == NULL){
  return;
 }
 dest = sour;
}
int main(){
 char *d = NULL;
 char *s = "Angus Declan R";
 //d = malloc(sizeof(strlen(s)+1));
 //my_strcpy(s,d);
 d = s;
 printf("\n %s \n",d);
 return 0;
}

これでは、「s」が指している場所を指すようにポインタ「d」を作成しようとしています。その場所を指していないのはなぜですか。

4

3 に答える 3

3

Cは値渡し言語です。 C FAQのこの質問は、あなたの質問に答えることができます。関数プロトタイプを修正しても、アルゴリズムは文字列をまったくコピーせず、ポインタだけをコピーすることに注意してください。その呼び出しを次のように置き換えることができます。

d = s;

あなたのmain関数で。mallocも不要です-あなたはそれを漏らしているだけです。

于 2013-03-08T04:17:43.420 に答える
2

それはc言語が価値によって渡されるからです。代わりに、ポインタのアドレスを渡します。

void my_strcpy(char *sour,char **dest)
// Condition checking and then do -
    *dest = sour ;
于 2013-03-08T04:17:26.283 に答える
1

ここで *d と *s は 2 つのポインターです。配列を指している s ポインターに格納されているアドレスをコピーしているだけで、配列には "Angus Declan R" が含まれています。d はアドレスを指すことはできません。

あなたが宣言/定義しているとき

int *s="アンガス デクラン R"; ---> 最初に配列がコード セグメント (読み取り専用領域) に作成され、s は現在その配列のベース アドレスを指しています。たとえ *su を使用して文字列に直接アクセスすることはできません。アドレスを使用しています。

唯一の理由は、メモリのコード セグメント領域に作成された配列です。

ここで %s は、null 値が検出されるまで、ベース アドレスを使用して値/文字列/文字を出力します。void my_strcpy() dest = sour; では malloc は不要です。も不要です。d=s; と同じです。.

説明が下手でしたらすみません。

于 2013-03-08T06:05:49.543 に答える