【发布时间】:2012-04-12 23:38:51
【问题描述】:
可能重复:
What is the difference between char a[] = “string” and char *p = “string”?
在堆栈内存和堆内存上使用 memcpy 有什么区别? 以下代码适用于 Tru64,但在 LINUX 上会出现段错误
char * string2 = " ";
(void)memcpy((char *)(string2),(char *)("ALT=---,--"),(size_t)(10));
第二个版本适用于 LINUX
char * string2 = malloc(sizeof(char)*12);
(void)memcpy((char *)(string2),(char *)("ALT=---,--"),(size_t)(10));
有人能解释一下 LINUX 上的段错误吗?
【问题讨论】:
-
堆栈:不是你想象的那样。
-
您的强制转换完全是滥用,使代码几乎无法阅读。它们都不是必需的,甚至没有用。
sizeof(char)也被定义为 1。malloc根据char的大小计算要分配的大小。 -
顺便说一句,在 Linux 上运行的第二个版本中,
string2指向的字符串不能保证在memcpy完成后被 nul 终止。这可能会在以后给您带来一些问题。 -
@Alexander:代码很荒谬——即使实现似乎允许修改字符串文字也是愚蠢的,而且为什么不直接写
char *string2 = "ALT=---,--<2 spaces>";?如果应用程序对安全至关重要,那么您需要特别仔细地查看修改该字符串文字对 Tru64 的影响。出现在代码不同部分的相同字符串字面量可以指向相同的内存,因此可能(希望不是)原作者依赖memcpy在其他地方产生另一个"<12 spaces>"实例代码突然改了!