memcpy
不分配任何内存。在您的memcpy
调用中,目标的内存是在定义arr
变量时分配的arr
( char arr[400]
)。
那里有一个问题,就是你没有分配足够的空间。sizeof(updata)
您将字节复制到arr
中,这可能是 1+4+7*256=1797 (这可能会有所不同,具体取决于sizeof(int)
是否__packed__
实际忽略了平台上所有未使用的字节)。如果你真的需要arr
(你可能不需要),至少让它变sizeof(updata)
大。定义它char arr[sizeof(updata)]
很好。
如果结构的布局是由某种外部格式定义的,则应该使用固定大小的类型而不是int
(取决于平台,它是 2 或 4 个字节,并且可能是其他大小,但您不太可能遇到它们)。
如果结构的布局是由某种外部二进制格式定义的,并且您想以这种格式打印出 1797 个字节,请使用fwrite
.
fwrite(updata, sizeof(updata), 1, stdout);
如果您想对数据进行人工表示,请使用printf
适当的格式规范。
printf("ip='%c' udp=%d\n", updata.ip, updata.ip);
for (i = 0; i < sizeof(updata.rules)/sizeof(updata.rules[0]); i++) {
puts(updata.rules[i].myname);
}
尽管有名字,char
实际上是字节的类型。C 中的字符没有单独的类型。类似的字符常量'a'
实际上是一个整数值(在几乎所有系统上都是 97,根据ASCII)。putchar
就像用或printf("%c", …)
将字节解释为字符一样编写它。
另一方面,如果在将指针(例如)与整数混合时编译器没有发出错误信号,请调高警告级别。char*
使用 Gcc,至少使用gcc -O -Wall
.
在实际编译您的代码后,我看到了主要错误(您应该在您的问题中复制粘贴了来自编译器的错误消息):
udpdata.rules[0].myname = "lalla\0" ;
udpdata.rules[0].myname
是一个字节数组。您不能分配给 C 中的数组。您需要一个一个地复制元素。由于这是一个 的数组char
,并且您想将一个字符串复制到其中,您可以使用它strcpy
来复制字符串的所有字节。一般来说,对于一堆字节,你会使用memcpy
.
strcpy(udpdata.rules[0].myname, "lalla");
(请注意,这"lalla\0"
等效于"lalla"
,所有字符串文字在 C 中都以零结尾。¹)由于strcpy
不执行任何大小验证,因此您必须确保字符串(包括其最终的空字符)适合您分配的内存为目标。您可以使用其他功能,例如,strncat
如果strlcpy
您想指定最大尺寸。
¹有一个例外(只有这个例外)"lalla"
不会以零结尾:当初始化一个 5 字节的数组时,例如char bytes[5] = "lalla"
. 如果数组大小至少为 6 或未指定,则将有一个终止零字节。