Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么指针操作失败?_C_Pointers - Fatal编程技术网

C 为什么指针操作失败?

C 为什么指针操作失败?,c,pointers,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;

我正在努力理解指针。我用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;

}

这个程序给出一个segfault。如果我将char*temp1=NULL更改为char*temp1,它仍然会失败。如果我将char*temp1更改为char temp1[80],代码就会正常工作。如果char temp1[1],该代码也可以工作,并将输出作为temp。我想输出应该是t。为什么是这样?为什么我会在char*temp.

中出错,因为您没有为目标字符串分配空间。您正试图在NULL位置写入内存,几乎肯定是0x00

Try char*temp1=mallocstrlentemp+1;或者类似的。这将分配一些内存,然后您可以将字符复制到内存中。+1表示尾随的空字符

如果您编写Java和friends,它将阻止您访问数组末尾的内存。但在语言层面上,C允许您在任何需要的地方写入内存。然后很有希望马上崩溃,但可能是下周。数组不是严格强制的数据类型,它们只是分配和引用内存的约定

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

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

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

更清楚。但这只是我的观点。

因为您没有为目标字符串分配空间。您正试图在NULL位置写入内存,几乎肯定是0x00

Try char*temp1=mallocstrlentemp+1;或者类似的。这将分配一些内存,然后您可以将字符复制到内存中。+1表示尾随的空字符

如果您编写Java和friends,它将阻止您访问数组末尾的内存。但在语言层面上,C允许您在任何需要的地方写入内存。然后很有希望马上崩溃,但可能是下周。数组不是严格强制的数据类型,它们只是分配和引用内存的约定

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

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

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

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

您必须为destination参数分配空间

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


您可以以静态方式(如数组)分配内存,也可以使用函数

为目标参数分配空间

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


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

,但这并不能完全解释为什么使用temp1[1]分配单个字节可以存储完整的字符串。还是运气好?啊,是的,我已经添加了解释。@Joe如果我将chartemp1=NULL更改为chartemp;它仍然存在断层。原因是否与没有内存分配相同,或者更多?可以说char*temp1比char*temp1=NULL更糟糕。如果不给它一个值,它可能会有一个随机值。在第一次赋值之前,C语言不会定义变量的值。也就是说,它可以指向内存中的任意随机位置。在使用变量之前,必须始终使用数据初始化变量。但这并不能完全解释为什么使用temp1[1]分配单个字节可以存储完整的字符串。还是运气好?啊,是的,我已经添加了解释。@Joe如果我将chartemp1=NULL更改为chartemp;它仍然存在断层。原因是否与没有内存分配相同,或者更多?可以说char*temp1比char*temp1=NULL更糟糕。如果不给它一个值,它可能会有一个随机值。在第一次赋值之前,C语言不会定义变量的值。也就是说,它可以指向内存中的任意随机位置。在使用变量之前,必须始终使用数据初始化变量。