【问题标题】:Passing a malloc'd char * into constructor, using printf on the char * gives segmentation fault将 malloc 的 char * 传递给构造函数,在 char * 上使用 printf 会导致分段错误
【发布时间】:2016-05-27 03:44:58
【问题描述】:

我有一个主函数调用它:

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);

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

【问题讨论】:

  • 为什么什么?你到底在问什么
  • 为什么会出现段错误?它不应该在“测试字符串”之后打印“完成”吗?另外,如果我将测试字符串更改为“测试字符串\0”,它仍然有问题。

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


【解决方案1】:

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

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

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

这里是malloc-ing 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未公开的导致核心转储的事情。

【讨论】:

  • 如何让代码在继续之前完成打印“完成”?我正在尝试调试我的程序以确保它正常工作,并想知道段错误发生的确切时间。
  • 之后立即致电fflush(stdout);。您是否考虑过使用调试器?如果不是,为什么不呢?这就是他们的目的。
  • 我会使用调试器,这只是一个特例。
  • 这是一种特殊情况,您在不使用调试器的情况下浪费了很多人的时间。
  • 顺便说一句,问题仍然存在。 Segfault 发生在我认为的第二个 printf 语句中。由于计算机问题和截止日期,我现在无法使用调试器。编辑过的原帖
【解决方案2】:

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

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


编辑

从您发布的内容来看,SEGFAULT 似乎与您发布的代码的 sn-p 无关。

【讨论】:

    猜你喜欢
    • 2022-06-13
    • 1970-01-01
    • 2014-08-12
    • 2015-08-06
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    相关资源
    最近更新 更多