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

この機能は正常に機能し、文字列を出力します。私の疑問は、ポインター「dest」が「\ 0」を指しているため、文字列全体をどのように出力するかです(文字列の最初のアドレスを指していないため)。

4

3 に答える 3

1

文字列の末尾destを指すのは本当です。しかし、別の変数を使用して文字列を出力しているのではありません。destd

C および C++ では、値はデフォルトで値渡しされることに注意してください。そのため、関数を呼び出すとmy_strcpy、変数の値は関数に対してのみローカルdな変数にコピーされ、その変数への変更は影響しません。destmy_strcpyd

また、変数に十分なスペースを割り当てていないことにも注意してください。d

d = malloc(sizeof(char*));

これにより、文字へのポインターに十分なスペースが割り当てられます。これは、通常、4 (または 8) 文字分のスペースを意味します。コピーする文字列に十分なスペースと、終端のヌル バイト用に 1 文字を割り当てる必要があります。コピーしようとしている文字列のサイズは? ヒント:strlen役立つはずです。

于 2013-03-07T19:40:41.297 に答える
0

渡されたdポインターはポインターのコピーであるため、関数内のポインターの位置/移動は、 で呼び出された場所に反映されませんmaindとの両方が (少なくとも最初は) 同じメモリ ブロックを指してdestおり、そのメモリ ブロックへの変更は両端に反映されますが、destポインタは単なるコピーです。

于 2013-03-07T19:39:05.087 に答える
0
 my_strcpy(s,d);

C は引数を値で渡します。の値 dが に渡され ます。これは、内部のオブジェクトが関数内で変更されていないmy_strcpyことを意味します 。dmainmy_strcpy

于 2013-03-07T19:39:05.877 に答える