我正在努力理解指针。我在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
时收到错误。
答案 0 :(得分:5)
因为您没有为目标字符串分配空间。你试图在位置NULL
写入内存(几乎可以肯定0x00
)。
尝试char* temp1= malloc(strlen(temp)+1);
或类似的东西。这将分配一些内存,然后你可以将字符复制到其中。 +1表示尾随空字符。
如果您编写了Java和朋友,它将阻止您访问数组末尾的内存。但在语言级别,C允许您在任何地方写入内存。然后崩溃(希望立即,但也许下周)。数组不是严格强制执行的数据类型,它们只是用于分配和引用内存的约定。
如果您将其创建为char temp1[1]
,那么您将在堆栈上分配一些内存。可以访问附近的内存(您可以读取和写入它),但是您将在其他内存上涂写其他内存。这是一个经典的内存错误。
另外样式:我个人建议不要使用++
的返回值。它更难阅读,让你三思而后行。
*dest = *source;
dest++;
source++;
更清楚。但那只是我的意见。
答案 1 :(得分:0)