C++ 初始化c+;时大小为1的读取无效+;二维数组中char*的字符串

C++ 初始化c+;时大小为1的读取无效+;二维数组中char*的字符串,c++,arrays,string,initialization,C++,Arrays,String,Initialization,标题几乎描述了这个问题。valgrind输出,例如: ==18866== Invalid read of size 1 ==18866== at 0x4A07F64: strlen (mc_replace_strmem.c:403) ==18866== by 0x3AD509CF1F: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_stri

标题几乎描述了这个问题。valgrind输出,例如:

==18866== Invalid read of size 1
==18866==    at 0x4A07F64: strlen (mc_replace_strmem.c:403)
==18866==    by 0x3AD509CF1F: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib64/libstdc++.so.6.0.13)
==18866==    by 0x401809: Employee::Employee(char const*, int, char**) (Employee.C:24)
==18866==    by 0x405F59: main (main.C:321)
==18866==  Address 0x4c25406 is 0 bytes after a block of size 6 alloc'd
==18866==    at 0x4A07152: operator new[](unsigned long) (vg_replace_malloc.c:363)
==18866==    by 0x40461C: main (main.C:90)
数组的初始化方式如下:

for (int ii=0;ii<7 && wrongParams == false;ii++)
        {
            z_str = strtok(NULL, delimiters);
            if (z_str)
            {
                strncpy(workHours[ii],z_str,6);
            }

for(int ii=0;ii我们看到的唯一工作时间分配是这个strncpy

strncpy(workHours[ii],z_str,6);
你在哪里分配了工作时间的空间?我们能看到main.c第90行的那一行吗

基于此错误消息,似乎要缩短一个字符

Address 0x4c25406 is 0 bytes after a block of size 6 alloc'd
==18866==    at 0x4A07152: operator new[](unsigned long) (vg_replace_malloc.c:363)
==18866==    by 0x40461C: main (main.C:90)

Main.c第90行可能是您分配它的地方。另外,在您的代码中使用工作时间的任何其他地方,请确保您没有执行默认值的strcpy,该默认值可能会在分配的6个字节后附加null。

您确实应该使用所有警告和调试信息进行编译(
g++-Wall-g
)-也许您已经这样做了-并学习如何使用调试器(
gdb
)和打印
i
hours[i]
在相关断点处。
strncpy
没有在给定的大小上添加一个字节。问题是它不能保证空终止。好的观点。问题可能是在strncpy之前对变量执行strcpy。我们需要从main.c第90行查看新的。
strncpy(workHours[ii],z_str,6);
Address 0x4c25406 is 0 bytes after a block of size 6 alloc'd
==18866==    at 0x4A07152: operator new[](unsigned long) (vg_replace_malloc.c:363)
==18866==    by 0x40461C: main (main.C:90)