【发布时间】:2021-02-19 00:17:33
【问题描述】:
我似乎无法弄清楚下面的代码有什么问题:
我有一个双指针 char 数组,声明并初始化如下:
unsigned char **buffer = (unsigned char**) malloc (num * sizeof(char*));
for ( i = 0; i < num; i++ )
{
buffer[i] = (unsigned char*) calloc(PACKETSIZE, sizeof(char));
}
然后我试图将一个字符串复制到 char* 数组之一的中间部分,但它似乎不起作用。我不确定我的错误是内存分配还是我尝试复制时。我知道来源char* 有内容。
我要复制的代码(Header 是一个结构,我想在 Header 的内存地址之后写入数组为buffer[i],所以我正在做一些指针运算)。
strncpy ((unsigned char *)(buffer[i]+sizeof(Header)), buffer2, bytes_to_copy);
代码运行后,buffer[i] 保持为空。
这是 Header 结构的示例:
typedef struct Head
{
unsigned int x;
unsigned int y;
} Header ;
【问题讨论】:
-
一般提示:
strncpy不是更安全的strcpy版本。仔细阅读文档。 -
那么PACKETSIZE和
sizeof(Header)是什么关系呢?这闻起来像是一个普通的越界访问。分几步执行这些操作,将buffer[i]+sizeof(Header)存储在 tmp 变量中并在调试器中观察它。是否有意义?另外,总是怀疑危险的strncpy函数,在这种情况下它实际上是否终止了字符串?如果可能,请改用更安全的strcpy或memcpy。 -
另外......如果你调用
buffer[i],它全为零。如果您随后写信给buffer[i] + whatever,那么buffer[i]仍将包含零。那么“空”是什么意思?根据您的程序设计,字符串buffer[i]的开头有一个空终止符。 -
所以我的问题似乎是你和阿德里安在下面的回答的结合。对于我的 strncpy,我最初忘记添加 Null 字符来终止我的缓冲区。但是,在我使用 strcpy 修复它之后,当我认为它仍然无法正常工作时,我的调试器语句仍然没有输出任何内容,但这是由于我的标头具有小的 unsigned int 值,当一个字节中有 0 时,它会起作用就像我的调试语句的空字符一样,所以数据包看起来是空的,但实际上不是。谢谢大家!
-
非常感谢大家的帮助!整个晚上都被困在这个问题上。
标签: c strcpy pointer-arithmetic double-pointer