我在下面的代码中得到Aborted(core dumped)

时间:2014-03-23 07:43:40

标签: c memory-management realloc

您好我在下面的代码中进行测试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 /

中很好地捕获字符串操作的好教程网站

3 个答案:

答案 0 :(得分:5)

错误在于:

char *ptr3;
char *ptr4;

您应该将它们初始化为NULL:

char *ptr3 = NULL;
char *ptr4 = NULL;

由于ptr3ptr4不是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*的函数作为未初始化的第一个参数(ptr3ptr4)调用。这有不确定的行为,这样的代码可能会发生任何事情。

一种正确的方法是检查该参数是否为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;
}