Realloc 崩溃:cygwin_exception::open_stackdumpfile:将堆栈跟踪转储到 malloc.exe.stackdump

Realloc crash: cygwin_exception::open_stackdumpfile: Dumping stack trace to malloc.exe.stackdump

我是动态内存分配的新手,我尝试编写一个简单的程序来连接 2 个字符串(一个已初始化,一个从标准输入读取),第一个字符串使用 realloc。但是我收到这个错误:

cygwin_exception::open_stackdumpfile:将堆栈跟踪转储到 malloc.exe.stackdump

代码在 realloc 时中断,我不知道为什么,请你帮忙?

输入:人还活着。

预期输出:世上最爱的人。

我试过用数字替换 strlen 但无济于事。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char *str = "The most beloved";
    char str2[20];
    scanf("%[^\n]%*c", str2);
    //printf("%s %s\n", str, str2);

    str = (char *)realloc(str, strlen(str) + strlen(str2));

    strcat(str, str2);
    printf("%s\n", str);
    free(str);
}

您正在分配一个指向 str 的指针,它不是使用 malloc 分配的。仅当它们已使用 malloc.

分配时,您才可以将指针传递给 freerealloc

Proper usage of realloc()

你可以做到

str = strdup("mystring");

这里还要考虑最后的[=17=],所以应该是:

str = (char *)realloc(str, strlen(str) + strlen(str2)+1);

您声明了一个指向字符串文字的指针

char *str = "The most beloved";

字符串文字具有静态存储持续时间。所以它们可能不会被动态重新分配。

因此这个声明

str = (char *)realloc(str, strlen(str) + strlen(str2));

调用未定义的行为。

注意需要为结果字符串的终止零字符'[=14=]'预留内存

您需要的是以下内容

char *result = ( char * )malloc( strlen(str) + strlen(str2) + 1 );

strcpy( result, str );
strcat( result, str2 );

puts( result );

free( result );

另外这样写会更安全

scanf("%19[^\n]", str2);