如标题所述。我不明白为什么这段代码会给我分段错误!
#include <stdio.h>
void cp(char s[], char d[]);
int main () {
char s[100] = "hi there how are you";
char d[100];
cp(s, d);
printf("%s\n++++++++\n%s\n", s, d);
return 0;
}
void cp(char s[], char d[]) {
int i, p = 0;
while (s[i] != '\0') {
d[i] = s[i];
++i;
++p;
}
}
我知道cp的实现很糟糕!我这样写是为了好玩,然后发生了段错误。
答案 0 :(得分:2)
在这一行代码中:
int i, p = 0;
您仅初始化p
,变量i
未初始化,从中读取将导致UB。
正确的循环可以这样写:
for( size_t i = 0; ( d[i] = s[i] ) != 0; ++i );
(还会复制空终止符,如果正确初始化i
将会丢失该空终止符)
另一种变体是经典的C语言:
void cp(const char *s, char *d)
{
while( *d++ = *s++ );
}
但通常在C目标中,第一个参数而不是第二个参数(例如strcpy()
)
答案 1 :(得分:1)
您只能在以下时间复制:
while (s[i] != '\0')
因此'\0'
不会被复制,因此在您运行时:
printf("%s\n++++++++\n%s\n", s, d);
您遇到段错误。
i
也未初始化:
int i, p = 0;
使用单独的行可以避免这种错字:
int i = 0;
int p = 0;
未初始化的i
可能会爆炸:
d[i] = s[i];
造成段错误。