use*_*657 -1 c++ string pointers c-strings char
我有一个主要功能,称之为:
int main (int argc, char * argv[]) {
char * x = (char*) malloc(100);
x = "test string";
printf("data: %s", x);
StreamManager * SM = new StreamManager(NULL, x);
}
Run Code Online (Sandbox Code Playgroud)
StreamManager在这里有一个构造函数:
StreamManager::StreamManager(ConnectionManager * CMin, char * data) {
printf("Creating StreamManager\n");
printf("%s\n", data);
printf("done");
...
}
Run Code Online (Sandbox Code Playgroud)
调用它给出了输出:
data: test stringCreating StreamManager
test string
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
为什么?它不应该被终止吗?
编辑:即使在更改后问题仍然存在.
主要:
char * x = (char*) malloc(100);
strcpy(x, "This is a test");
StreamManager * SM = new StreamManager(NULL, x);
Run Code Online (Sandbox Code Playgroud)
构造器:
printf("Creating StreamManager\n");
printf("%s\n", data);
printf("done");
fflush(stdout);
Run Code Online (Sandbox Code Playgroud)
完成不打印.我认为segfault正在构造函数的第二个printf中发生.
将malloc的char*传递给构造函数,在char*上使用printf会产生分段错误
你没有'将malloc
'd '传递给char *
任何构造函数:
char * x = (char*) malloc(100);
Run Code Online (Sandbox Code Playgroud)
在这里你是malloc
100字节并存储地址x.
x = "test string";
Run Code Online (Sandbox Code Playgroud)
在这里,您要更改变量x
以指向文字字符串"test string"
,哪个NB已经以空值终止.此时您还导致了100字节的内存泄漏.
printf("Creating StreamManager\n");
Run Code Online (Sandbox Code Playgroud)
在这里,您成功打印了一条消息.
printf("%s\n", data);
Run Code Online (Sandbox Code Playgroud)
在这里你成功打印"test string"
.
printf("done");
Run Code Online (Sandbox Code Playgroud)
在这里你成功打印"done"
,但由于stdio
缓冲可能没有出现.
...
Run Code Online (Sandbox Code Playgroud)
在这里,您正在做其他未公开的事情,这会导致核心转储.