我正在努力理解指针.我在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.
因为您没有为目标字符串分配空间.你正试图在位置写入内存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)
更清楚.但那只是我的个人意见.