我第一次输入字符串大小为9, 在我重新分配并尝试打印字符串之后 它是打印整个字符串。如何解决这个问题。 然后记忆会发生什么 5个字节..!是自动解除分配还是不需要做任何事情。 因为你们告诉要在第4位添加'\ 0'。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
char *ptr;
char str[10];
printf("enter a string:\n");
scanf("%s",str);
ptr=(char *)malloc(sizeof(char)*10);
strcpy(ptr,str);
printf("entered string is: %s\n",ptr);
ptr=(char *)realloc(ptr,5);
strcat(ptr,"\0");//i just tried but not helping
printf("new string is: %s\n",ptr);
free(ptr);
}
答案 0 :(得分:3)
"\0"
相当于一个空字符串,因此将strcat
转换为ptr
将无法执行任何操作。
相反,将元素4
设置为空字节:
ptr = realloc(ptr, 5);
ptr[4] = '\0';
如果字符串超过4个字符,它将被截断,如果不是,它将无效,因为终结符在它之前。
另外,使用strncpy
代替strcpy
和not plain scanf("%s")
以避免缓冲区溢出。
考虑下面的Cody Gray的评论,但实际上,你应该只分配sizeof str
。
答案 1 :(得分:0)
@ false&#39的答案绝对正确,但他没有解释为什么最初打印整个字符串。
原因是因为调用realloc
具有较小的大小实际上不会导致任何初始化发生,特别是不会导致写入内存。相反,它只是告诉内存管理系统第5个字节后的字节现在可以重用。
如果之后你做了一大堆malloc
,你可能最终会看到字符串被破坏的结尾。
答案 2 :(得分:0)
在C中,STRING表示以空字符结尾的字符数组(内存块) 例如,字符串“enter”将占用6个字节的内存(包括空终止)
char* ptr = "test"; //will AUTO-allocated 5 bytes to stored string "test\0"
malloc,realloc,free
是第一个malloc中的内存管理器,而不是字符串操纵器
ptr=(char *)malloc(sizeof(char)*10);
在realloc 之后,系统将为代码目的保留10个字节
ptr=(char *)realloc(ptr,5);
当新大小适合预先分配的位置时,原始数据 MAY 仍然保留,但在这一点上,最后5个字节已经返回到系统,strcat它可能导致程序崩溃,因为你试图访问内存 NOT 属于您的代码,如果只需要缩小字符串或其他内容,请改用字符串函数