为什么这个指针操作会失败?

时间:2012-10-08 17:26:02

标签: c pointers

我正在努力理解指针。我在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* temp1更改为char temp1[80],则代码可以正常运行。该代码也适用于char temp1[1]并将输出作为临时值。我在想输出应该是t。为什么会这样?为什么我会在char* temp时收到错误。

2 个答案:

答案 0 :(得分:5)

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

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

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

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

另外样式:我个人建议不要使用++的返回值。它更难阅读,让你三思而后行。

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

更清楚。但那只是我的意见。

答案 1 :(得分:0)

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

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

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