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;
}
您的代码错误:
str_result
声明中有错别字:,
而不是 ;
- 您必须使用
strcpy
将字符串复制到 char *
:strcpy (str_result, "Action done");
而不是 str_result = "Action done";
%c
是打印字符的格式,而不是 %s
。
- 如果要将
len
定义为 size_t
类型,则必须对 printf
. 使用 %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
逐个字符地打印它,否则从循环中调用它是没有意义的。
我在我的程序中使用了 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;
}
您的代码错误:
str_result
声明中有错别字:,
而不是;
- 您必须使用
strcpy
将字符串复制到char *
:strcpy (str_result, "Action done");
而不是str_result = "Action done";
%c
是打印字符的格式,而不是%s
。- 如果要将
len
定义为size_t
类型,则必须对printf
. 使用
%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
逐个字符地打印它,否则从循环中调用它是没有意义的。