gpt4 book ai didi

C++ 全局字符指针?

转载 作者:行者123 更新时间:2023-11-27 23:26:54 25 4
gpt4 key购买 nike

我正在制作的一个较大程序的一部分需要从命令行读取路径并存储在类中。因为路径可以是任意大小并且在多个函数中需要它,所以我将它存储在头文件中的 char* 中。但是,出于某种原因,当我为其赋值时,程序会出现段错误。

调试器 (gdb) 显示如下:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7b4828a in std::basic_istream<char, std::char_traits<char> >& std::operator>><char, std::char_traits<char> >(std::basic_istream<char, std::char_traits<char> >&, char*) ()
from /usr/lib/libstdc++.so.6

这是我为演示该问题而编写的程序:

测试.cpp:

#include "test.h"

#include <iostream>
#include <cstring>

Test::Test() {
filepath = NULL;
}

void Test::set_path(char* string) {
char temp[strlen(string) + 1];
strcpy(filepath, temp);
}

char * Test::get_path() {
return filepath;
}

int main(int argc, char *argv[]) {
std::cout << "Enter a file path: ";
char *temp;
std::cin >> temp;
Test *temp2 = new Test();
temp2->set_path(temp);
std::cout << "Path: " << temp2->get_path() << std::endl;
}

测试.h:

#ifndef TEST_H
#define TEST_H

class Test {
private:
char *filepath;

public:
Test();
void set_path(char *);
char * get_path();
};

#endif // TEST_H

我不确定它为什么会崩溃。我这样做的方法有问题吗?此外,我不只是切换到 string,而是想了解有关此问题的更多信息。

提前致谢!

最佳答案

temp(在 main 内)未初始化且未指向任何有效分配的内存块,因此行:

std::cin >> temp;

导致输入被写入内存的某个未知部分,从而导致未定义的行为。您应该:

  • temp 设为 char[] 并只读入适合缓冲区的字符数。
  • temp 指向一个有效的缓冲区。
  • 更好,将 temp 设为 std::string,并让 std::string 类担心内存管理。


解决上述问题后,您还会遇到与 filePath 类似的问题。 filePathTest 构造函数中被设置为 NULL,然后您将 temp 复制到Test::set_pathfilePath 指向的内存:

strcpy(filepath, temp);

NULL 指的是您不允许取消引用的地址。您应该将所有 C 字符串更改为 std::string,并使用 std::string 成员函数和重载运算符来处理 C++ 中的字符串。

关于C++ 全局字符指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8628065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com