将malloc的char*传递给构造函数,在char*上使用printf会产生分段错误

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中发生.

use*_*421 5

将malloc的char*传递给构造函数,在char*上使用printf会产生分段错误

你没有'将malloc'd '传递给char *任何构造函数:

char * x = (char*) malloc(100);
Run Code Online (Sandbox Code Playgroud)

在这里你是malloc100字节并存储地址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)

在这里,您正在做其他未公开的事情,这会导致核心转储.