为什么这个strncpy()实现在第二次运行时崩溃,而第一次运行正常?
斯特尼
从字符串复制字符复制源的第一个n字符
到目的地。如果源C字符串的结尾(已发出信号
在复制n个字符之前发现,
在总共n个字符
已经写好了。
如果
源的长度大于n(因此,在这种情况下,目标可能不是
以空结尾的C字符串)。

char *strncpy(char *src, char *destStr, int n)
{
    char *save = destStr; //backing up the pointer to the first destStr char
    char *strToCopy = src; //keeps [src] unmodified

    while (n > 0)
    {
        //if [n] > [strToCopy] length (reaches [strToCopy] end),
        //adds n null-teminations to [destStr]
        if (strToCopy = '\0')
            for (; n > 0 ; ++destStr)
                *destStr = '\0';

        *destStr = *strToCopy;
        strToCopy++;
        destStr++;
        n--;

        //stops copying when reaches [dest] end (overflow protection)
        if (*destStr == '\0')
            n = 0; //exits loop
    }

    return save;
}

/////////////////////////////////////////////

int main()
{
    char st1[] = "ABC";
    char *st2;
    char *st3 = "ZZZZZ";
    st2 = (char *)malloc(5 * sizeof(char));


    printf("Should be: ZZZZZ\n");
    st3 = strncpy(st1, st3, 0);
    printf("%s\n", st3);

    printf("Should be: ABZZZZZ\n");
    st3 = strncpy(st1, st3, 2);
    printf("%s\n", st3);

    printf("Should be: ABCZZZZZ\n");
    st3 = strncpy(st1, st3, 3);
    printf("%s\n", st3);

    printf("Should be: ABC\n");
    st3 = strncpy(st1, st3, 4);
    printf("%s\n", st3);

    printf("Should be: AB\n");
    st2 = strncpy(st1, st2, 2);
    printf("%s\n", st2);

    printf("Should be: AB\n");
    st2 = strncpy(st1, st2, 4);
    printf("%s\n", st2);
}

最佳答案

你有一个分割错误是因为

char *st3 = "ZZZZZ";

目标是字符串文本。不能修改字符串文本,通常它们存储在写保护内存中。所以当你打电话
strncpy(st1, st3, n);

使用n > 0,您试图修改字符串文字,这会导致崩溃(不一定,但通常是这样)。
在复制循环中,您忘记取消引用strToCopy
if (strToCopy = '\0')

并写入=而不是==,因此将strToCopy设置为NULL,从而导致进一步取消对strToCopy的引用以调用未定义的行为。

关于c - 为什么此strncpy()实现在第二次运行时崩溃?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13588118/

10-13 06:59