【发布时间】:2014-09-18 21:25:57
【问题描述】:
我有以下代码无法成功运行。 src 被分配了一个内存地址,但 dest 没有。我正在使用 Xcode 5 进行命令行开发
#include <stdio.h>
#include <string.h>
int main ()
{
char* src;
char* dest;
memcpy(src, "This is source", 15);
memcpy(dest, "This is destination", 20);
strcat(dest, src);
printf("Final destination string : |%s|", dest);
return(0);
}
声明后,src 的值为 "" 并有地址,但 dest 为 NULL。我知道这是一个愚蠢的问题,但需要一些帮助才能解决这个问题。
更新 经过大量调查后,我开始知道我需要在 memcpy 之前为指针初始化空间,尽管 Xcode 没有提供我可以轻松找到的有用警告或异常。
正确的用法是使用malloc初始化空间然后做memcpy。
char* src;
char* dest;
src = malloc(sizeof(char)*15);
dest = malloc(sizeof(char)*34);
memcpy(src, "This is source", 15);
memcpy(dest, "This is destination", 20);
或者我们也可以使用 char 数组并在 dest 上留出足够的空间。
char src[15];
char dest[34];
memcpy(src, "This is source", 15);
memcpy(dest, "This is destination", 20);
【问题讨论】:
-
Both
src和dst在您的示例中包含垃圾值。它们没有初始化。无论他们最初碰巧持有什么,纯属偶然。初始化变量是您的责任。没有人会为你做这件事。 -
我现在知道这个问题有一些负面影响,所以我无法对 SF 提出更多问题。如果您看到我的更新,我会感谢您,请重新添加积分。对于初学者来说,你不能认为这是常识,好像我不应该问一样。但是 Linux 和 Mac 中的警告和错误可能会有所不同,并且有些东西不够直观,无法意识到这个问题。在 Xcode 上,当您查看难以判断的溢出数组元素时,它会在观察程序中为您提供 0 值