2017-05-15 7 views
0

私は自分のmemcpy()関数を書いています。ソース文字列を宛先にコピーしています。コピー中は、「セグメンテーションフォルト」としてエラーが発生します。私はコードブロックを使用しています。なぜ誰かが説明できますか?文字列を間違ってコピーしていますか?Cで文字列をコピーする正確な方法は何ですか?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
typedef struct node 
{ 
    char info; 
    struct node *next; 
}mynode; 


void mymemcpy(void*,const void*,size_t); 

int main() 
{ 
    char *p="sonampulkit"; 
    char *q=p+2; 
    mymemcpy(q,p,strlen(p)+1); 
    printf("\n final dest=%s ",q); 
    printf("\n final src=%s ",p); 
    return 0; 
} 

void mymemcpy(void* to,const void* from,size_t n) 
{ 
    char *src=(char*)from; 
    char *dest=(char*)to; 
    printf("source=%s",src); 
    printf("\ndestination=%s",dest); 
    printf("\nsize=%d",n); 
    int i=0; 
    for(i=0;i<n;i++) 
    { 
     printf("\ndest=%c",*(dest+i)); 
     printf("\nsrc=%c",*(src+i)); 
     // At below line , error occurred. 
     dest[i]=src[i]; 
    } 
    return dest; 
} 

エラー:プログラム受信セグメンテーションフォルト。

+1

文字列リテラルの変更は未定義の動作です。 void mymemcpy(void *、const void *、size_t); ' –

+0

ヒント:' char p [100] = "sonampulkit";で試してみてください。 'の代わりに 'char * p =" sonampulkit ";' –

答えて

0

char *p="sonampulkit";

pは - リテラル文字列、Cの標準メモリを変更禁止へのポインタである:それは未定義の動作です。

+0

あなたのフレーズの後半部分はあまり意味がありません、UBは理由ではなく、何かが標準によって定義されていないことを表現する方法です。単に「理由」という言葉を削除してください。 –

関連する問題