C++ 使用strncpy时出现异常

C++ 使用strncpy时出现异常,c++,string,pointers,C++,String,Pointers,执行strncpy函数时,以下代码片段以异常结束: #define MAX_FILENAME_LEN 127 typedef struct { unsigned long nameLength; char name[MAX_FILENAME_LEN + 1]; } filestructure; char *fileName; strncpy( fileName, filestructure->name, MAX_FILENAME_LEN ); *( fileName + MAX_FI

执行
strncpy
函数时,以下代码片段以异常结束:

#define MAX_FILENAME_LEN 127

typedef struct {
unsigned long nameLength;
char name[MAX_FILENAME_LEN + 1];
} filestructure;

char *fileName;

strncpy( fileName, filestructure->name, MAX_FILENAME_LEN );
*( fileName + MAX_FILENAME_LEN+1 ) = 0; 

有人知道会出什么问题吗?在文件结构中,我有一个50个字符长的文件名,所以它在范围内。。。我真的有点不知所措,在这个简单的代码片段中,什么会导致问题…

您没有为目标缓冲区分配空间,并且
文件名
未初始化。所以你试着在某个地方复制。您应该分配内存,然后释放内存

char *fileName = new char[MAX_FILENAME_LEN + 1];
strncpy(...);
*(...) = 0;
doStuffWithTheBuffer( fileName );
delete[] fileName;// free memory
另外,如果您有一个大小为N+1的缓冲区,并且希望最大复制N个字节并为null,则应终止该缓冲区

*(buffer + N) = 0;

您尚未为目标缓冲区分配空间,
fileName
未初始化。所以你试着在某个地方复制。您应该分配内存,然后释放内存

char *fileName = new char[MAX_FILENAME_LEN + 1];
strncpy(...);
*(...) = 0;
doStuffWithTheBuffer( fileName );
delete[] fileName;// free memory
另外,如果您有一个大小为N+1的缓冲区,并且希望最大复制N个字节并为null,则应终止该缓冲区

*(buffer + N) = 0;

您尚未为文件名分配空间。或者

filename = malloc (MAX_FILENAME_LEN * sizeof(char));


您尚未为文件名分配空间。或者

filename = malloc (MAX_FILENAME_LEN * sizeof(char));


你的问题是用C++来标记,但是代码是纯C。为什么你要这么做?C字符串处理不是那么容易掌握的事实(而且偶尔对某些错误也不常见,即使对于掌握它的程序员也是如此),这就是C++没有使用的原因。p>

如果你正在写C++,那么用C++的方式来做。使用

std::string
。老实说,这将节省您调试此类代码的许多时间

如果你正在写C++,那么用C++的方式来做。使用

std::string
。老实说,这将节省您调试此类代码的许多时间

马洛克??在C++应用程序中。请使用newmalloc??在C++应用程序中。请只使用newUse std::string,除非你有一个很好的理由不这样做。“一个例外”?您使用的是C函数,C没有异常。在任何情况下,当询问您遇到的错误时,描述错误有时会有所帮助。你得到的是哪一个异常?@jalf:可能是操作系统异常,可能是访问违规。有趣的是,这段代码看起来很像是某个“克劳斯”问的第一个答案的副本。我怀疑“Robert”和“Claus”是同一个人。除非你有很好的理由,否则请使用std::string。“例外”?您使用的是C函数,C没有异常。在任何情况下,当询问您遇到的错误时,描述错误有时会有所帮助。你得到的是哪一个异常?@jalf:可能是操作系统异常,可能是访问违规。有趣的是,这段代码看起来很像是某个“克劳斯”问的第一个答案的副本。我怀疑罗伯特和克劳斯是同一个人。