Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 有记忆问题_C - Fatal编程技术网

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