1

我正在努力理解指针。我用 C 编写了这个字符串复制功能。

#include<stdio.h>

char *my_strcpy(char *dest, char *source)
{
   while (*source != '\0')
   {
     *dest++ = *source++;
   }
   *dest = '\0';
 return dest;
}

int main(void)
{
  char* temp="temp";
  char* temp1=NULL;
  my_strcpy(temp1,temp);
  puts(temp1);



  return 0;

}

char* temp1=NULL这个程序给出了一个段错误。如果我改成char* temp1仍然它失败。如果我更改char* temp1char temp1[80],则代码有效。char temp1[1]如果输出为 temp,则该代码也有效。我在想输出应该是t。为什么会这样,为什么会出现错误char* temp

4

2 回答 2

5

因为您没有为目标字符串分配空间。NULL您正在尝试在位置(几乎可以肯定0x00)写入内存。

尝试char* temp1= malloc(strlen(temp)+1);或类似的东西。这将分配一些内存,然后您可以将字符复制到其中。+1 用于结尾的空字符。

如果您编写 Java 和朋友,它会阻止您访问数组末尾的内存。但是在语言级别上,C 可以让你在任何你想要的地方写入内存。然后崩溃(希望立即但可能在下周)。数组不是严格强制执行的数据类型,它们只是分配和引用内存的约定。

如果您创建它,char temp1[1]那么您将在堆栈上分配一些内存。可能可以访问附近的内存(您可以对其进行读写),但您将在其他用于其他用途的内存上涂鸦。这是一个经典的内存错误。

还有风格:我个人建议不要使用++s 的返回值。它更难阅读,让你三思而后行。

*dest = *source;
dest++;
source++;

比较清楚。但那只是我的个人意见。

于 2012-10-08T17:27:31.807 回答
0

您必须为目标参数分配空间。

使用 时char temp1[80],会在内存中分配 80 个字节。

您可以以静态方式分配内存,如数组,或使用malloc函数

于 2012-10-08T17:30:29.343 回答