我有一个调用它的主函数:
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中发生。
答案 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似乎与您发布的代码段无关。