c-Realloc崩溃:cygwin_exception::open_stackdumpfile:正在将堆栈跟踪转储到m



我是动态内存分配的新手,我试着写一个简单的程序,用realloc作为第一个字符串来连接两个字符串(一个初始化,一个从stdin读取(。但我收到这个错误:

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 %sn", str, str2);
str = (char *)realloc(str, strlen(str) + strlen(str2));
strcat(str, str2);
printf("%sn", str);
free(str);
}

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

char *str = "The most beloved";

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

因此,

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

调用未定义的行为。

请注意,您需要为结果字符串的终止零字符''保留内存。

您需要的是以下

char *result = ( char * )malloc( strlen(str) + strlen(str2) + 1 );
strcpy( result, str );
strcat( result, str2 );
puts( result );
free( result );

而且写会更安全

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

您正在为未使用malloc分配的str分配指针。只有使用malloc分配了指向freerealloc的指针,才能将指针传递给它们。

正确使用realloc((

你可以做

str = strdup("mystring");

此外,在这里,您需要说明最后的,因此它应该是:

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

最新更新