#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main ()
{
char *imsi;
unsigned int i;
int val;
char *dest;
imsi = "405750111";
strncpy(dest,imsi,5);
printf("%s",dest);
/* i = 10; */
}
在上面的代码中,如果i=10赋值如上所述,则代码工作正常,没有错误当编译包含赋值时,错误(分段错误)发生在strncpy(dest,imsi,5);。
通过避免对变量i(即volatile int i;)进行优化,即使包含赋值(i=10),也会清除错误。
最佳答案
在你的代码中,通过说
strncpy(dest,imsi,5);
您正在尝试写入一个单元化指针
dest
它可以(而且很可能会)指向某些程序无法访问的内存(无效内存)。它调用undefined behavior。没有什么可以保证一个程序有UB。它可以按预期工作(实际上取决于你的预期),也可以崩溃或打开你的银行账户,将所有资金转移到某个潜在的恐怖组织。
注意-我希望通过读最后一行你会害怕,所以底线是
不要试图写入任何未初始化的指针(内存区域)周期。
关于c - 此代码的strcpy()/未初始化char指针背后的技巧是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36477421/