2016-10-30 49 views
2

我有一些问题,复制一个指针到另一个内容。我无法将* s的内容复制到* a。如果我删除* a的凹凸,它仅复制s中的最后一个字符。也不允许使用任何字符串库函数或任何数组符号。对不起,如果格式不好,这是我的第一篇文章。预先感谢您的帮助。复制字符指针进入下再字符指针没有的strcpy

char* copy(char *s) 
{ 
    char *a = (char *) malloc(sizeof(char)*length(s)); 
    if (s == NULL) 
    { 
     printf("ERROR: OUT OF MEMORY\n"); 
     return 0; 
    } 
    while(*s != '\0') 
    { 
     *a = *s; 
     s++; 
     a++; 
    } 

    *a = '\0'; 
    return a; 
} 
+2

不要投的它返回malloc的值什么也没加。 'char * a = malloc(sizeof(char)* length(s));'很好。另外,你的测试应该是'if(a == NULL)'(不是's') – Tibrogargan

+3

'length'是什么? –

+0

@ M.M,可能只是他自己的'strlen'函数。 – RoadRunner

回答

3

切勿修改已分配指针的值。如果你这样做,可能会失去跟踪地址,并无法释放它。

char* copy(const char *s) 
{ 
    char *a = malloc(length(s)+1); 
    if (a == NULL) 
    { 
     perror("malloc failed"); 
     return NULL; 
    } 

    char *c = a; 
    while(*s != '\0') 
    { 
     *c = *s; 
     s++; 
     c++; 
    } 

    *c = '\0'; 
    return a; 
} 

非常简单的测试:在

int main(int argc, char *argv[]) 
{ 
    const char *s = "this is a test string"; 
    char *a; 

    if (NULL != (a = copy(s))) { 
     printf("The copy is: %s\n", a); 
     free(a); 
    } 
} 

结果:

副本是:这是一个测试字符串

+0

BLUEPIXY可能会对我提出建议,但如果你这样做:'char * const a = malloc(length(s)+1)'如果在返回之前尝试修改它,编译器会警告你。 – Tibrogargan

+0

做出这些更改后,* c将填充适当的值,但* a不是且正在返回空白空间。 – Makthe2nd

+0

@ Makthe2nd这是奇怪的行为,因为C和指向同一块内存。你确定没有错字? – Tibrogargan