0

我在“C”中有一个函数应该实现我自己的 strcpy 程序。这是我写的。但是,我无法调试分段错误的原因。

#include <stdio.h>
#include <stdlib.h>

char * mystrcpy(char *dest, char *src) {
    char * ptr = dest;
    while (*src != '\0'){
        *ptr = *src;
        ptr++; src++;
        //printf("Dest is \"%s\" and Source is \"%s\"\n",dest,src);
    }
    *ptr = '\0';
    return dest;
}


int main() {
    char str[] = "I rock always";
    char * dest = NULL;
    dest = mystrcpy(dest, str);
    printf("Source String %s and Destination String %s\n", str, dest);
}

有人可以向我解释这种行为吗?

4

5 回答 5

4

您必须为目标字符串分配内存:

int main() {
    char str[] = "I rock always";
    char * dest = (char*)malloc(strlen(str) + 1);
    dest = mystrcpy(dest, str);
    printf("Source String %s and Destination String %s\n", str, dest);
}

当然,最终释放内存是一种礼貌:

    free(dest);
于 2012-06-24T09:45:21.553 回答
1

*dest你永远不会为指向 分配任何内存。

它开始指向 NULL,然后您尝试:*ptr = *src

于 2012-06-24T09:45:17.620 回答
0

分配内存并尝试....

         #include <stdio.h>
         #include <stdlib.h>

         char * mystrcpy(char *dest, char *src) 
         {
                     char * ptr = dest;
                     int index=0;
                     while (*src != '\0')
                     {
                         *(ptr+index) = *(src+index);
                           index++;
                     }
                     *(ptr+index) = '\0';
                     return dest;

          }




          int main() 
          {
                char str[] = "I rock always";
                char * dest = (char*)malloc((strlen(str)+1)*sizeof(char));
                dest = mystrcpy(dest, str);
                printf("Source String %s and Destination String %s\n", str, dest);
                free(dest);
                return 0;
          }
于 2012-06-24T09:58:22.483 回答
0
#include <stdio.h>

    /* this the K&R version of strcpy */
char * mystrcpy(char *dest, char *src) {
    char *ptr = dest;
    while ( *ptr++ = *src++ ) {;}

    return dest;
}


int main(void) {
    char str[] = "I rock always";
    char dest[sizeof str];
    char *result;

    result = mystrcpy(dest, str);
    printf("Source String %s and Destination String %s and result %s\n", str, dest, result);
    return 0;
}
于 2012-06-24T10:05:31.917 回答
0

您必须为目标字符串缓冲区分配内存。

内存管理是 C 语言中非常重要的一部分……您需要非常小心地分配和释放内存,因为它已被使用并超出需求。不这样做会导致分段错误(未能分配内存)和内存泄漏(未能释放内存)

此处的其他答案为您提供了 malloc 的示例,因此我不会在这里重复。

您应该尽可能地使用您已经可用的功能,而不是自己编写。这避免了实施中的错误,因为有人已经为您调试和优化了它。

http://www.cs.cf.ac.uk/Dave/C/node19.html

于 2012-06-24T09:45:23.133 回答