使用realloc函数

时间:2014-05-23 05:56:32

标签: c

我第一次输入字符串大小为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);
}

3 个答案:

答案 0 :(得分:3)

"\0"相当于一个空字符串,因此将strcat转换为ptr将无法执行任何操作。

相反,将元素4设置为空字节:

ptr = realloc(ptr, 5);
ptr[4] = '\0';

如果字符串超过4个字符,它将被截断,如果不是,它将无效,因为终结符在它之前。

另外,使用strncpy代替strcpynot 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 属于您的代码,如果只需要缩小字符串或其他内容,请改用字符串函数