字符数组似乎在memcpy()之后增长,有什么问题?

时间:2010-02-09 06:37:21

标签: c

我正在使用大小为4的char [],但是当我使用memcpy()函数时,它会在其中存储8个字符,并且字符数组长度也变为8.什么是happing?

我不想使用malloc ok。

char strRoh[4]={'\0'};

然后

memcpy(strRoh,Dump+22,4);

现在告诉我这个

有什么问题
char strIP[]="hhhhhhhh";
char strRoh[4]={'\0'};
char strTheta[4]={'\0'};
char strTimeStamp[6]={'\0'};
char strNMDump[48]={'\0'};  

是否有任何减速问题导致当我改变顺序他们的字符串也改变那里大小现在strroh得到10个字符

这是怎么回事?

5 个答案:

答案 0 :(得分:6)

C字符串以0结尾。这意味着如果您想在C中使用长度为n的字符串,则需要n+1 char s:

char hello[5] = "hello";

不是字符串,因为hello有5 char的空间,并且不会以0结尾。

char hello[6] = "hello";

是一个字符串,有6个字符:hello0

为了能够在C中使用字符串相关的函数,您需要终止0。

因此,请将代码更改为:

char strRoh[5]={'\0'};
char strTheta[5]={'\0'};
char strTimeStamp[7]={'\0'};
char strNMDump[49]={'\0'};

请注意,在C中,执行:

char hello[] = "hello";

编译器为你做计数,并使hello成为一个大小为6的数组(一个终止为0):

printf("%zu\n", sizeof hello);

将打印6。

答案 1 :(得分:3)

源指针和目标指针指向的对象的基础类型与memcpy无关;结果是数据的二进制副本。

该函数不检查源中的任何终止空字符 - 它总是复制精确的num个字节。我的猜测是你没有添加终止空值并试图以字符串形式访问它。

答案 2 :(得分:1)

C对其数据类型没有任何边界检查。

所以在调试代码时你可能“看到”的是它在数组中显示8个字节。正如其他人所说,您可能会尝试将其视为字符串,并且没有终止零字节。这在C语言中是很正常的,而且这是语言的一个方面,这使得它很难理解。

我建议你在C下阅读内存和指针处理的一个很好的介绍,或者切换到C#,VB.NET,Java,Perl,Python等托管语言。

答案 3 :(得分:0)

我认为如果你记忆到一个字节数组,如果char有2个字节,你可能会得到8个字节,即每个字符为2个字节。

然而,我对这个C / C ++事情很生气。所以希望有更多经验的人会给你一个更好的答案。

答案 4 :(得分:0)

问题是你有一个4字节的char数组,你在memcpy期间写了4个字节而没有为终止空字符留下任何空间。将您的数组声明为5个字节,并将其全部初始化为null(您已经在做),一切都应该没问题。