我的细分错误,我不明白为什么

时间:2019-12-17 20:21:55

标签: c segmentation-fault

如标题所述。我不明白为什么这段代码会给我分段错误!

#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的实现很糟糕!我这样写是为了好玩,然后发生了段错误。

2 个答案:

答案 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];

造成段错误。