您好我在下面的代码中进行测试realloc()
我收到错误Aborted (Core dumped)
。
代码的输出低于
$ ./realloc
My Name // <<-- This works
Aborted (core dumped) // <<-- why this error occur?
第一次调用copyThis()
函数会得到正确的结果并且不会产生错误。以同样的方式,如果我第二次调用copyThis()
,则会出错。我不明白为什么会这样。任何人都可以指出问题出在哪里以及我应该做些什么调整?
代码低于
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *copyThis(char *str1, const char *str2, size_t size);
int main(void)
{
char *ptr1 = "My Name ";
char *ptr2 = "is Alice";
char *ptr3;
char *ptr4;
ptr3 = copyThis(ptr3, ptr1, strlen(ptr1) + 1); // This works
printf("%s\n", ptr3);
ptr4 = copyThis(ptr4, ptr2, strlen(ptr2) +1); // this line make Aborted (core dumped)
printf("%s\n", ptr4);
}
char *copyThis(char *str1, const char *str2, size_t size)
{
str1 = (char *) realloc(str1, size);
strncat(str1, str2, strlen(str2));
str1[size] = '\0';
return str1;
}
注意:请指出任何可以帮助我在c /
中很好地捕获字符串操作的好教程网站答案 0 :(得分:5)
错误在于:
char *ptr3;
char *ptr4;
您应该将它们初始化为NULL:
char *ptr3 = NULL;
char *ptr4 = NULL;
由于ptr3
和ptr4
不是NULL,realloc
假设它们是指向有效内存的指针。来自man realloc
:
除非ptr为NULL,否则必须由之前的调用返回 到malloc(),calloc()或realloc()。
由于这些指针指向内存中的随机地址,realloc
在实际使用它们时会感到困惑。
更一般地说,在这种情况下,在编译代码时启用其他诊断非常有用。例如,如果您使用gcc
,并且使用-Wall
编译代码,则会发出以下警告:
file.c:19:1: warning: control reaches end of non-void function [-Wreturn-type]
file.c:14:10: warning: ‘ptr3’ is used uninitialized in this function [-Wuninitialized]
file.c:17:10: warning: ‘ptr4’ is used uninitialized in this function [-Wuninitialized]
如何启用这些额外的警告取决于您用于开发的IDE,如果有的话;否则,如果您使用命令行,只需将-Wall
添加到gcc
的调用中。
答案 1 :(得分:2)
str1[size] = '\0';
写入超出分配的内存,因此程序崩溃。您应该为0
字符再分配一个。
另一个错误是您将char*
的函数作为未初始化的第一个参数(ptr3
和ptr4
)调用。这有不确定的行为,这样的代码可能会发生任何事情。
一种正确的方法是检查该参数是否为0
,然后只调用具有适当大小的malloc
。但是对于这种工作方法,你必须用0
正确地初始化这些变量,无论如何你应该这样做。
另外,不要归还malloc
和亲戚的回报,这可能会隐藏微妙的错误。
答案 2 :(得分:0)
你的代码的问题是你没有初始化指针,当你尝试使用realloc它有垃圾值而gdb显示:
断点1,copyThis( str1 = 0x7fffffffe060 “\ 001”,str2 = 0x4007e4“我的名字”,大小= 8)在prog1.c:22 22 str1 =(char *)realloc(str1,size); (gdb)n
编程接收信号SIGSEGV,分段故障。 来自/lib/x86_64-linux-gnu/libc.so.6的realloc()中的0x00007ffff7a95b54
由于垃圾地址失败了。因此,无论何时使用指针,总是尝试在使用之前初始化它们。
所以正确的程序是:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *copyThis(char *str1, const char *str2, size_t size);
int main(void)
{
char *ptr1 = "My Name";
char *ptr2 = "is Alice";
char *ptr3 = NULL;
char *ptr4 = NULL;
ptr3 = copyThis(ptr3, ptr1, sizeof(ptr1) ); // This works
printf("%s\n", ptr3);
ptr4 = copyThis(ptr4, ptr2, sizeof(ptr2) ); // this also works
printf("%s\n", ptr4);
}
char *copyThis(char *str1, const char *str2, size_t size)
{
str1 = (char *) realloc(str1,size);
strncat(str1, str2, strlen(str2));
str1[size] = '\0';
return str1;
}