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
.
分配时,您才可以将指针传递给 free
或 realloc
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);
我是动态内存分配的新手,我尝试编写一个简单的程序来连接 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
.
free
或 realloc
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);