2016-03-30 27 views
-1
#include <stdio.h> 
#include<stdlib.h> 
void *mymemmove(const char *str1,const char* str2,int n) 
{ 
    char *tmp = (char*)malloc(sizeof(char)*n); 
    memcpy(tmp,str2,n); 
    memcpy(str1,tmp,n); 
    free(tmp); 
    return NULL; 
} 

int main(void) { 
    // your code goes here 
    char *p1,*p2,*p3,*p4; 
    //p1= (char *)malloc(sizeof(char)*30); 
    p1="ankitagrawal"; 
    p2=p1+2; 
    char *tmp = (char*)malloc(sizeof(char)*13); 
    memcpy(tmp,p1,13); 
    memcpy(p2,tmp,13); 
    printf("p1 = %s /n p2= %s tmp =%s",p1,p2,tmp); 
    //mymemmove(p2,p1,13); 
    //printf("p1 = %s /n p2= %s",p1,p2); 
    return 0; 
} 

Kodum, ana işlevdeki ikinci memcpy'de çöküyor. Herkes bana kodla ilgili sorunun ne olduğunu söyleyebilir mi?bu C kodunun neden çöküyor

+2

'p2' değiştirilemez hafızadır bir hazır dizeye işaret ediyor. Yani memcpy (p2, tmp, 13) 'un tanımsız bir davranıştır. Bkz. Http://stackoverflow.com/q/164194/12711 –

+1

Yasal olsa bile, 13 byte 'p1 + 2' ye kopyalamak, sınırlarını aşar. –

+1

Dize sabitleri genellikle korunan belleğe yerleştirilir. Bu kodun yaptığı gibi bunları değiştirmeye çalışamazsınız. –

cevap

0

p2 = p1 + 2'yi kullanarak ve p2'den 13 baytlık belleğe kaydetmeye çalışırken, p2 için ayrılmış olan bellekte 2 baytlık bir artış olur ve bu da mutlaka hata üretir.

kod aşağıda ele alalım:

char *p1, *p2, *p3, *p4; 
    p1 = "ankitagrawal"; 
    p2= (char *)malloc(14); 
    memcpy(p2, p1 + 2, 14); 
    printf("\np2 = %s", p2); 
    char *tmp = (char*)malloc(14); 
    memcpy(tmp, p1, 14); 
    memcpy(p2, tmp, 14); 
    printf("p1 = %s \np2= %s \ntmp = %s", p1, p2, tmp);