Memcpy 函数在 C 中崩溃

Memcpy Function crashing in C

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

#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);

    str_result = "Action done";
    size_t len = strlen(str_result);
    printf("string length is = %d\n", len);
    memcpy(str_dst, str_result, len);
    str_dst [len] = '[=10=]';
    for (i = 0; i < len; i++) {
        printf("%s\n", str_dst[i]);
    }
    free(str_dst);
    free(str_result);

    return 0;
}

错误在这里:

free (str_result);

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

  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]='[=14=]';    // manually add null character, memcpy won't add it 
   printf("%s\n", str_dst);

  free(str_dst);
  free(str_result);

  return 0;
}

在您使用 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 类型,则必须对 printf.
  5. 使用 %zu 格式

您有以下错误:

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 逐个字符地打印它,否则从循环中调用它是没有意义的。