【发布时间】:2013-03-15 03:19:18
【问题描述】:
为什么下面的没问题?
char *a;
char b[]="asdf";
a=b;
但以下不是?
char a[10];
char b[]="asdf";
a=b;
上面给出了错误:分配中的类型不兼容。
【问题讨论】:
-
我发现您不太可能在第一个示例中至少没有收到一些警告。您能否发布编译器的完整输出?
为什么下面的没问题?
char *a;
char b[]="asdf";
a=b;
但以下不是?
char a[10];
char b[]="asdf";
a=b;
上面给出了错误:分配中的类型不兼容。
【问题讨论】:
两个都不行。
也许你在尝试,
char *a;
char b[]="asdf";
a=b;
【讨论】:
char a;
char b[]="asdf";
a=b;
在这里,您将数组b 的地址分配给a,它是char 类型。地址的大小将为 4 个字节(64 位 m/c 中的 8 个字节),您将其分配给 1 个字节 char 变量 a,因此这些值将被截断。这是合法的,但没有用。
我认为您实际上是在尝试将b 数组的第一个字符分配给a。在这种情况下,请执行a = b[0]。
【讨论】:
数组的值等于数组中第一个元素的地址。所以基本上,它是一个常数值。这就是为什么当您尝试在第二个示例中执行 a=b 时,您正在尝试执行类似于 2=7 的操作,只是您有两个地址而不是 2 个整数。
现在第一个示例可以运行是有道理的,因为将地址分配给指针是有效的操作。
【讨论】:
您需要为字符串库包含以下标头。
#include <string.h>
如果有足够的空间,使用 strcpy(strX, strY); 会将字符串 Y 复制到字符串 X 中。
【讨论】:
strcpy() 确实不检查是否有足够的可用空间,实际上它没有办法这样做。您可以使用strncpy() 来控制您不会缓冲溢出,但您可能需要手动插入最终的空字节。
请使用 c++ 的 strcpy_s 函数,它的语法是 &dest,*source 它可能会有所帮助。
【讨论】: