C中的Memcpy函数崩溃

C中的Memcpy函数崩溃,c,pointers,memcpy,C,Pointers,Memcpy,我在程序中使用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;

我在程序中使用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);

    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] = '\0';
    for (i = 0; i < len; i++) {
        printf("%s\n", str_dst[i]);
    }
    free(str_dst);
    free(str_result);

    return 0;
}
#包括
#包括
#包括
int main(int argc,char*argv[]){
int i;
char*stru结果;
char*str_dst=NULL;
str_result=(char*)malloc(100);
str_dst=(char*)malloc(100);
str_result=“行动完成”;
尺寸长度=strlen(str结果);
printf(“字符串长度=%d\n”,len);
memcpy(stru-dst,stru-result,len);
str_dst[len]='\0';
对于(i=0;i
错误在这里:

free (str_result);
str_result=“Action done”行之后
stru result
不再指向您保留的100字节内存块,而是指向字符串(
const char*
“操作完成”
。无法释放此指针。

错误如下:

free (str_result);
  str_result = "Action done";
str_result=“Action done”行之后
stru result
不再指向您保留的100字节内存块,而是指向字符串(
const char*
“操作完成”
。无法释放此指针

  str_result = "Action done";
在此之后,
str\u结果
不会指向由
malloc
分配的块。因此,释放malloc或类似程序未分配的内存可能会导致程序出错(我最喜欢的语句之一)

使用注释中建议的strcpy
-

strcpy(str_result,"Action done");
并且在打印时
stru dst
-

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

#包括
#包括
#包括
int main(int argc,char*argv[]){
int i;
char*stru结果;
char*str_dst=NULL;
str_result=malloc(100);
str_dst=malloc(100);
strcpy(str_result,“Action done”);//在str_result指向的位置复制字符串
尺寸长度=strlen(str结果);
printf(“字符串长度=%zu\n”,len);
memcpy(stru-dst,stru-result,len);
str_dst[len]='\0';//手动添加空字符,memcpy不会添加它
printf(“%s\n”,stru-dst);
免费(STRU dst);
自由(stru结果);
返回0;
}
在此之后,
str\u结果
不会指向由
malloc
分配的块。因此,释放malloc或类似程序未分配的内存可能会导致程序出错(我最喜欢的语句之一)

使用注释中建议的strcpy-

strcpy(str_result,"Action done");
并且在打印时
stru dst
-

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

#包括
#包括
#包括
int main(int argc,char*argv[]){
int i;
char*stru结果;
char*str_dst=NULL;
str_result=malloc(100);
str_dst=malloc(100);
strcpy(str_result,“Action done”);//在str_result指向的位置复制字符串
尺寸长度=strlen(str结果);
printf(“字符串长度=%zu\n”,len);
memcpy(stru-dst,stru-result,len);
str_dst[len]='\0';//手动添加空字符,memcpy不会添加它
printf(“%s\n”,stru-dst);
免费(STRU dst);
自由(stru结果);
返回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;
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
int i;
char*stru结果;
char*str_dst=NULL;
str_result=(char*)malloc(100);
str_dst=(char*)malloc(100);
strcpy(str_结果,“行动完成”);
尺寸长度=strlen(str结果);
printf(“字符串长度=%zu\n”,len);
memcpy(stru-dst,stru-result,len+1);

对于(i=0;i低于使用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;
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
int i;
char*stru结果;
char*str_dst=NULL;
str_result=(char*)malloc(100);
str_dst=(char*)malloc(100);
strcpy(str_结果,“行动完成”);
尺寸长度=strlen(str结果);
printf(“字符串长度=%zu\n”,len);
memcpy(stru-dst,stru-result,len+1);

对于(i=0;i您有以下错误:

铸造malloc的结果是毫无意义的

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

大小的正确格式说明符是
%zu


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

您有以下错误:

铸造malloc的结果是毫无意义的

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

大小的正确格式说明符是
%zu


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

您知道它在哪一行崩溃吗?使用
strcpy
而不是将指针指定给字符串文本。和
printf(“字符串长度=%d\n”(
-->
printf(“字符串长度=%zu\n”,len);
不,我实际上正在尝试打开.exe文件,但它本身没有打开。@Cool Guy:我想看看memcpy的正确用法,它是“len”。谢谢你。@learningpal-我想它可能会崩溃,因为你是
free()
ing字符串文本的地址。另外,请不要强制转换
malloc()
的返回。您知道它在哪一行上崩溃吗?请使用
strcpy
而不是指定
printf("%s\n", str_dst[i]);