C分配内存

时间:2016-08-02 11:50:50

标签: c arrays string pointers

这一定是一个非常简单的问题,但我发现很难找到答案。

在C中,我编写了以下strncpy - 类似函数:

int mystrncpy(char* s, char* t, int n) {
    // copies at most n characters of t into s, assuming s is long enough

    while (n > 0 && (*t != 0)) {
        *(s++) = *(t++);
        n--;
    }

    // at this point, either n=0 (in which case we ran out of string to copy)
    // or *t = 0 (in which case we now need to null-terminate the string)
    *s = 0;

    return 0;
}

(它与strncpy的不同之处在于它始终确保s在结尾处以空值终止,并且其参数已相对于strncpy进行交换。)

现在,如果我按如下方式调用它:

int main() {
    char s[5] = "hello";
    char* t = "oppagangnamstyle";

    mystrncpy(s, t, 10);

    printf("%s\n", s);
    return 0;
}

我希望得到某种“尝试访问s的元素5”错误,因为s被分配为只有五个字符长。

实际发生的是打印“oppagangna”,程序返回退出代码0

当我逐步使用调试器时,在mystrncpy中,字符s指向的是先后'h','e','l','l','o',' \ 0','\ 0',...

它只是侥幸(或者,同样的事情,编译器/操作系统对我来说意外的好),s恰好在内存中有零后,很高兴被填充执行mystrncpy期间有更多元素?或者我误解了别的什么?

0 个答案:

没有答案