C++ 将字符串文字读入指针时出现令人尴尬的错误

C++ 将字符串文字读入指针时出现令人尴尬的错误,c++,pointers,hexdump,C++,Pointers,Hexdump,我觉得写这篇文章有点迟钝,但我不知道为什么我的程序在从键盘读取字符串文字(即,然后将其分配给指针)时会崩溃 我们已经调试了一个多小时,当程序从键盘读取数据时,它一直在爆炸 我已经尽了一切努力来解决这个问题。将字符串初始化为字符串文字(即,编译器说它与nullptr有问题)。就好像我在某处有一个看不见的角色。如果有人能告诉我我做错了什么,我将不胜感激 main.cpp #define _CRTDBG_MAP_ALLOC #include <crtdbg.h> #include <

我觉得写这篇文章有点迟钝,但我不知道为什么我的程序在从键盘读取字符串文字(即,然后将其分配给指针)时会崩溃

我们已经调试了一个多小时,当程序从键盘读取数据时,它一直在爆炸

我已经尽了一切努力来解决这个问题。将字符串初始化为字符串文字(即,编译器说它与nullptr有问题)。就好像我在某处有一个看不见的角色。如果有人能告诉我我做错了什么,我将不胜感激

main.cpp

#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>

#include <iostream>
#include <fstream>
#include "protocol.h"

int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

int menuChoice = 0;

char * fileName = nullptr;
char * byteArray = nullptr;
char * hexArray = nullptr;
int numberOfBytes = 0;

PrintMenu();
GetMenuChoice(menuChoice);
ExecuteMenuChoice(menuChoice, fileName, byteArray, hexArray, numberOfBytes);

return 0;
}
void GetFile(char * fileName)
{

//Prompt user for binary file
std::cout << "\nEnter filename: " << std::endl;

//Read in location of binary file
std::cin.ignore(std::cin.rdbuf()->in_avail());
std::cin.getline(fileName, 256);
std::cin.clear();
std::cin.ignore(std::cin.rdbuf()->in_avail());
}

您发布的代码不完整,但我看不到您在调用
std::cin.getline(fileName,256)
之前分配文件名,我看不到您调用
GetFile
的任何地方,但它看起来需要分配的缓冲区或字符数组。在
main()
中声明一个
char*fileName
,但不为其分配任何内存。如果您调用(从
main()
GetFile(fileName)
,那么我希望它会崩溃。您需要在
main()
GetFile()
中分配空间来读取数据。

传递要填充的字符串文本没有任何意义。您需要传递一个缓冲区:

#include <iostream>
#include <fstream>
#include <stdlib.h> // for _MAX_PATH

int main()
{
    char filename[_MAX_PATH];

    GetFile(filename);

    std::cout << filename << std::endl;
}
cin::getline()不会为您分配内存以将字符串文本存储到
文件名中。您必须为它提供内存空间,方法是将内存分配给
文件名
,就像

fileName = new char[_MAX_PATH];
最后,别忘了释放内存

delete[] fileName;

它不是字符串文字,除非它是源代码中存在的字符串马上。但你甚至没有展示它是如何被使用的。再现问题的最小示例在哪里?什么是“程序不断爆炸”意思?丢失
char*fileName
(在此代码中的所有
char*
s)并使用
std::string
。我同意,这个问题将相当尴尬…
malloc()
free()
?这个问题没有标注吗?C++不拒绝<代码> Malc C >代码> <代码>免费>代码>,它是多范例的。但是,<代码>新< /COD>和 FEX//COD>应该是更好的选择:-不拒绝这些函数并不意味着它们是习惯C++。使用<代码>新< /C> >已编辑的更接近C++风格,但这需要与 Dele[]/Cuff>耦合。由于您知道编译时的大小,因此在堆栈上分配内存(如我的回答中所示)更有意义。谢谢:-)我更愿意在实践中使用
std::string
,而不是在堆栈上分配内存,尽管大小在编译时是已知的。我喜欢保持堆栈小,以尽可能避免潜在的堆栈溢出。谢谢你们,抱歉这个愚蠢的问题。让它工作起来。:)@先生5:很乐意帮忙。
fileName = new char[_MAX_PATH];
delete[] fileName;