Memcpy函数在C中崩溃

时间:2015-09-24 12:44:14

标签: c pointers memcpy

我在我的程序中使用memcpy并将其用作语法。但是这个功能崩溃了。我在这里阅读了一些帖子并尝试初始化我的char数组,但我没有在这里得到问题。任何人都可以看看吗?

>Px016979
MSPWMKKVFLQCMPKLLMMRRTKYSLPDYDDTFVSNGYTNELEMSRDSLT
DAFGNSKEDSGDYRKSPAPEDDMVGAGAYQRPSVTESENMLPRHLSPEVA
AALQSVRFIAQHIKDADKDNEVVEDWKFMSMVLDRFFLWLFTIACFVGTF
GIIFQSPSLYDTRVPVDQQISSIPMRKNNFFYPKDIETIGIIS
>Px016980
MQFIKKVLLIALTLSGAMGISREKRGLIFPPTSLYGTFLAIAVPIDIPDK
NVFVSYNFESNYSTLNNITEIDEVLFPNLPVVTARHSRSITRELAYTVLE
TKFKEHGLGGRECLLRNICEAAETPLHHNGLLGHIMHIVFTPSSSAEEGL
DDEYYEAEASGRAGSCARYEELCPVGLFDLITRIVEFKHT
>Px002185
MLSPSVAIKVQVLYIGKVRISQRKVPDTLIDDALVKFVHHEAEKVKANML
RRHSLLSSTGTSIYSSESAENLNEDKTKTDTSEHNIFLMMLLRAHCEAKQ
LRHVHDTAENRTEFLNQYLGGSTIFMKAKRSLSSGFDQLLKRKSSRDEGS
GLVLPVKKVT
>Px006321
MFPGRTIGIMITASHNLEPDNGVKLVDPDGEMLDGSWEEIATRMANVRYL
PMSLITKFLVNSYY

4 个答案:

答案 0 :(得分:5)

错误在于:

free (str_result);

在行str_result = "Action done";之后,str_result不再指向您保留的100字节内存块,而是指向字符串(const char*"Action done"。你不能释放这个指针。

答案 1 :(得分:4)

  str_result = "Action done";

此后str_result未指向由malloc分配的块。因此,释放未由malloc或类似内容分配的内存可能会导致程序错误(我最喜欢的语句之一)。

使用评论中建议的strcpy -

strcpy(str_result,"Action done");

打印时str_dst -

for (i = 0; i < len; i++) {
    printf("%s\n", str_dst[i]);   // passing char where char * is expected
}

您不需要循环来打印str_dst。这只会起作用 -

printf("%s",str_dst);

更正后的代码(Demo) -

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

int main(int argc, char *argv[]) {
   int i;
   char *str_result;
   char *str_dst = NULL;
   str_result =  malloc(100);
   str_dst =  malloc(100);

   strcpy(str_result, "Action done");  // copy string at location where str_result points to 
   size_t len = strlen(str_result);
   printf("string length is = %zu\n", len);
   memcpy(str_dst, str_result, len);
   str_dst[len]='\0';    // manually add null character, memcpy won't add it 
   printf("%s\n", str_dst);

  free(str_dst);
  free(str_result);

  return 0;
}

答案 2 :(得分:3)

使用memcpy

修正后的代码下方
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
    int i;
    char *str_result;
    char *str_dst = NULL;
    str_result = (char *) malloc (100);
    str_dst = (char *) malloc (100);

    strcpy (str_result, "Action done");
    size_t len = strlen (str_result);
    printf ("string length is = %zu\n", len);

    memcpy(str_dst, str_result, len+1);

    for (i =0;i<len;i++)
    {
        printf( "%c\n", str_dst[i]);
    }

    free (str_dst);
    free (str_result);

    return 0;
}

代码出错:

  1. str_result声明中有一个拼写错误:,而不是;
  2. 您必须使用strcpy将字符串复制到char *strcpy (str_result, "Action done");而不是str_result = "Action done";
  3. %c是打印字符的格式,而不是%s
  4. 如果您想将len定义为size_t类型,则必须使用%zu printf格式。

答案 3 :(得分:2)

您有以下错误:

str_result = (char *) malloc(100);

转换malloc的结果毫无意义。

str_result = "Action done";

这不是您在C中分配字符串的方式。您必须使用strcpy()。现在,您创建了内存泄漏。这就是free(str_result);以后导致程序崩溃的原因,str_result不再指向已分配的内存。

printf("string length is = %d\n", len);

size_t的正确格式说明符为%zu

printf("%s\n", str_dst[i]);

str_dst是一个字符串,而不是一个字符串数组。除非您打算使用%c逐个字符地打印它,否则从循环中调用它是没有意义的。