C 有记忆问题
你能告诉我为什么要打印数据吗■ε■????如何仅打印数据??感谢您首先分配内存,然后通过使用字符串文字重新分配指针来丢弃内存。C 有记忆问题,c,C,你能告诉我为什么要打印数据吗■ε■????如何仅打印数据??感谢您首先分配内存,然后通过使用字符串文字重新分配指针来丢弃内存。calloc()的参数看起来也非常错误 另外,memcpy()不是字符串复制函数,它不包括终止符。您应该使用strcpy() 仅打印数据的最佳方式似乎是 char *a=NULL; char *s=NULL; a=(char *)calloc(1,(sizeof(char))); s=(char *)calloc(1,(sizeof(char))); a="
calloc()
的参数看起来也非常错误
另外,memcpy()
不是字符串复制函数,它不包括终止符。您应该使用strcpy()
仅打印数据的最佳方式似乎是
char *a=NULL;
char *s=NULL;
a=(char *)calloc(1,(sizeof(char)));
s=(char *)calloc(1,(sizeof(char)));
a="DATA";
memcpy(s,a,(strlen(a)));
printf("%s",s);
您需要更清楚地了解您想要做什么,以获得有关指针/分配/复制的帮助。C中的字符串以零字符值(nul)结尾 strlen返回零之前的字符数 所以你不是在复制零 printf继续运行,在s之后打印内存中的任何内容,直到它达到零 您还只创建了大小为1的缓冲区,因此您在s之后的任何位置上写入数据,并且在将a设置为文本之前将内存calloc'd泄漏到a
在找到字符串的长度后,为s分配内存,再分配一个字节以包含nul终止符,然后将a复制到s中。您不需要为a分配任何内容,因为C运行时负责存储文字“数据”。您为1个字符保留了空间,因此在编写“数据”(即4个字符+尾随的
\0
来标记字符串的结尾)时,实际上使用了其他变量的内存
对于本例,您需要5个或更多字符:
a=(char *)calloc(1,(sizeof(char)));
您需要在
数据字符串之后存储一个终止的\0
,这样printf()
将知道停止打印
您可以将memcpy
替换为strcat
:
a=(char *)calloc(5, (sizeof(char)));
我应该这样做
但是,请注意,前面有一个bug:
strcat(s, a);
将只分配一个字节!这当然还不够!根据实现的不同,您的程序可能会崩溃,也可能不会崩溃。strlen只计算没有终止符“\0”的字符数。
没有这个终止符,printf就不知道字符串的结束
puts("DATA");
解决方案:
memcpy(s,a,(strlen(a)+1)) 你的
calloc(1,sizeof(char))
清除指向已分配内存的指针。它不会将“数据”复制到内存中。但是,这不足以存储它,因为
a="DATA";
分配一个字符。当
a=(char *)calloc(1,(sizeof(char)));
将a(字符串文字“数据”)指向的内容复制到s指向的内存中。但同样,s
指向分配的单个字符,复制超过1个字符将覆盖某些内容并导致错误
strlen(a)
为您提供4个字符(“数据”的长度),memcpy只复制4个字符。但是为了知道字符串的结尾,C使用约定将最后一个“null”字符('\0')放在它的结尾。所以实际上,“数据”在内存中是“D”A“T”A“\0”
所有与字符串相关的函数都需要空字节,并且在找到它之前不会停止打印
要复制字符串,请改为使用strcpy(或strncpy),它也会复制带有最终空字节的字符串。(strcpy
不太“安全”,因为您可能会使目标缓冲区溢出)
但我在这里看到的最大问题是,您只为a(然后将其丢弃)和s保留了一个字符,因此数据\0将不适合任何地方
memcpy(s,a,(strlen(a)));