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

giz*_*gok 1 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;

}
Run Code Online (Sandbox Code Playgroud)

这个程序给出了段错误.如果我char* temp1=NULL改为char* temp1仍然失败.如果我char* temp1改为char temp1[80],代码可以工作.代码也适用于if char temp1[1]并将输出作为temp.我在想输出应该是t.为什么会这样,为什么我会收到错误char* temp.

Joe*_*Joe 5

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

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

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

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

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

*dest = *source;
dest++;
source++;
Run Code Online (Sandbox Code Playgroud)

更清楚.但那只是我的个人意见.