C 复制到缓冲区期间出现分段错误

C 复制到缓冲区期间出现分段错误,c,heap-memory,dynamic-memory-allocation,C,Heap Memory,Dynamic Memory Allocation,我写代码: #include <stdio.h> #include <stdlib.h> #include <string.h> int main(){ char * var=(char*) calloc(10, sizeof(char)); strncpy(var,"123456789",9); strncpy(var, "abcdefghi",1000000 ); printf("This

我写代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
        char * var=(char*) calloc(10, sizeof(char));
        strncpy(var,"123456789",9);
        strncpy(var, "abcdefghi",1000000 );
        printf("This is var == %s\n",var);

}
#包括
#包括
#包括
int main(){
char*var=(char*)calloc(10,sizeof(char));
strncpy(var,“123456789”,9);
strncpy(var,“abcdefghi”,1000000);
printf(“这是var==%s\n”,var);
}

但是在编译和运行他之后,我有了
分段错误
错误。如果我将
strncpy(var,“abcdefghi”,1000000)
行中的最大复制字符数更改为10,则可以正常工作。但是我真的不明白为什么在我的情况下会发生
分段错误
错误。

strncpy
总是填充到缓冲区的末尾,所以这一行:

 strncpy(var, "abcdefghi",1000000 );
导致SEG故障


正如您所看到的,缓冲区的剩余部分填充有
\0
strncpy
始终填充到缓冲区的末尾,因此此行:

 strncpy(var, "abcdefghi",1000000 );
导致SEG故障


正如您所看到的,缓冲区的剩余部分填充了
\0

,因为您分配了10个字节:

char * var=(char*) calloc(/*HERE->*/10, sizeof(char));

并尝试向其中复制1000000字节。

因为您分配了10个字节:

char * var=(char*) calloc(/*HERE->*/10, sizeof(char));

并尝试将1000000字节复制到它。

@HAL9000,依我看,
strncpy
总是填充整个缓冲区并不是很直观。一旦您阅读了手册(和注释),唯一的结论是您很少需要strncpy()。不要用它。直到你真正需要它(这可能需要几年)。管理概要:strncpy():=红旗。@HAL9000,依我看,
strncpy
总是填充整个缓冲区不是很直观。一旦你阅读了手册(和注释),唯一的结论是你很少需要strncpy()。不要用它。直到你真正需要它(这可能需要几年)。管理概要:strncpy():=红旗,但
strncpy(var,“abcdefghi”,1000)不会导致segfault。“我很困惑。”德米特里:这是一种未定义的行为。任何事情都有可能发生。(可能堆或malloc()的内部簿记结构已损坏,稍后会发生错误。或者不会)@wildplasser是的,现在我明白了。谢谢大家。但是
strncpy(var,“abcdefghi”,1000)不会导致segfault。“我很困惑。”德米特里:这是一种未定义的行为。任何事情都有可能发生。(可能堆或malloc()的内部簿记结构已损坏,稍后会发生错误。或者不会)@wildplasser是的,现在我明白了。谢谢大家。