我在我的程序中使用memcpy并将其用作语法。但是这个功能崩溃了。我在这里阅读了一些帖子并尝试初始化我的char数组,但我没有在这里得到问题。任何人都可以看看吗?
>Px016979
MSPWMKKVFLQCMPKLLMMRRTKYSLPDYDDTFVSNGYTNELEMSRDSLT
DAFGNSKEDSGDYRKSPAPEDDMVGAGAYQRPSVTESENMLPRHLSPEVA
AALQSVRFIAQHIKDADKDNEVVEDWKFMSMVLDRFFLWLFTIACFVGTF
GIIFQSPSLYDTRVPVDQQISSIPMRKNNFFYPKDIETIGIIS
>Px016980
MQFIKKVLLIALTLSGAMGISREKRGLIFPPTSLYGTFLAIAVPIDIPDK
NVFVSYNFESNYSTLNNITEIDEVLFPNLPVVTARHSRSITRELAYTVLE
TKFKEHGLGGRECLLRNICEAAETPLHHNGLLGHIMHIVFTPSSSAEEGL
DDEYYEAEASGRAGSCARYEELCPVGLFDLITRIVEFKHT
>Px002185
MLSPSVAIKVQVLYIGKVRISQRKVPDTLIDDALVKFVHHEAEKVKANML
RRHSLLSSTGTSIYSSESAENLNEDKTKTDTSEHNIFLMMLLRAHCEAKQ
LRHVHDTAENRTEFLNQYLGGSTIFMKAKRSLSSGFDQLLKRKSSRDEGS
GLVLPVKKVT
>Px006321
MFPGRTIGIMITASHNLEPDNGVKLVDPDGEMLDGSWEEIATRMANVRYL
PMSLITKFLVNSYY
答案 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;
}
代码出错:
str_result
声明中有一个拼写错误:,
而不是;
strcpy
将字符串复制到char *
:strcpy (str_result, "Action done");
而不是str_result = "Action done";
%c
是打印字符的格式,而不是%s
。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
逐个字符地打印它,否则从循环中调用它是没有意义的。