strcpy()/ uninitialized char指针这个代码背后的诀窍是什么?

#include  #include  #include  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 。 它可以(并且很可能会)指向某些无法从程序访问的内存(无效内存)。 它调用未定义的行为 。

关于具有UB的程序,没有什么可以保证的。 它可以按预期工作(实际上取决于您的期望 ),也可能会崩溃或打开您的银行账户并将所有资金转移到某个潜在的恐怖组织。

注意 – 我希望通过阅读最后一行你害怕,所以底线是

不要尝试写入任何未初始化的指针(内存区域)。 期。

此代码的行为是不可预测的,因为指针dest在初始化之前使用。 观察到的行为的差异仅与根本原因错误间接相关,根本原因是未初始化的变量。 在C中,程序员有责任为strncpy()函数的输出分配存储空间,而您还没有这样做。

最简单的解决方法是定义一个输出缓冲区,如下所示:char dest [10];