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是的,现在我明白了。谢谢大家。