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

时间:2016-02-16 02:51:37

标签: c++ string pointers char c-strings

我有一个调用它的主函数:

int main (int argc, char * argv[]) {
    char * x = (char*) malloc(100);
    x = "test string";
    printf("data: %s", x);
    StreamManager * SM = new StreamManager(NULL, x);
}

StreamManager在这里有一个构造函数:

StreamManager::StreamManager(ConnectionManager * CMin, char * data) {
    printf("Creating StreamManager\n");
    printf("%s\n", data);
    printf("done");

    ...
}

调用它会得到输出:

data: test stringCreating StreamManager
test string
Segmentation fault (core dumped) 

为什么呢?它不应该被终止吗?

编辑:即使在更改后问题仍然存在。

主要

char * x = (char*) malloc(100);
strcpy(x, "This is a test");
StreamManager * SM = new StreamManager(NULL, x);

构造

printf("Creating StreamManager\n");
printf("%s\n", data);
printf("done");
fflush(stdout);

完成不打印。我认为segfault正在构造函数的第二个printf中发生。

2 个答案:

答案 0 :(得分:5)

  

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

您没有通过malloc' d char *'进入任何构造函数:

char * x = (char*) malloc(100);

这里是malloc - 100个字节并将地址存储到x.

x = "test string";

在这里,你改变变量x以指向文字字符串"test string",其中NB已经以空值终止。此时您还导致了100字节的内存泄漏。

printf("Creating StreamManager\n");

您在这里成功打印了一条消息。

printf("%s\n", data);

您已成功打印"test string"

printf("done");

您已成功打印"done",但由于stdio缓冲,可能无法显示。

...

在这里你正在做一些 else 未公开的导致核心转储的事情。

答案 1 :(得分:2)

x = "test string";没有将字符串复制到您分配的缓冲区中,而是将x指向指向const char*的{​​{1}}。

在这种情况下你必须使用"test string"函数,如strcpy(char * destination, const char * source ),它也将处理它的空终止部分。

修改

根据您发布的内容,SEGFAULT似乎与您发布的代码段无关。